Java面接問題集錦------反射メカニズムとエージェントモード
新Instanceの役割はクラスをロードし、Java仮想マシンのクラスロードメカニズムを通じて指定したクラスをメモリにロードすることです.
2.クラスまたはインタフェースがJava仮想マシンにロードされると、それに関連付けられたjava.lang.Classオブジェクトが生成されます.Class.forNameメソッドにより、指定されたクラスのClassオブジェクトが得られます.このクラスの属性やメソッドなどの元の情報が含まれています.newInstanceメソッドにより、指定されたクラスをロードできます.
リンク:Javaオブジェクトを作成する4つの方法:
(1)newを使用してオブジェクトを作成する;
(2)反射のメカニズムを使用してオブジェクトを作成する:
《1》ClassクラスのnewInstanceメソッドを使用する:
Class heroClass = Class.forName("yunche.test.Hello");
Hello h =(Hello) heroClass.newInstance();
《2》 Constructor newInstance :
//
Class heroClass = Class.forName("yunche.test.Hello");
//
Constructor constructor = heroClass.getConstructor();
Hello h =(Hello) constructor.newInstance();
(3) clone:
clone , , , 。
clone Cloneable , clone protected , ;
(4) :
, Serializable , , 。
Hello h = new Hello();
//
File f = new File("hello.obj");
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
// ,
oos.writeObject(h);
//
Hello newHello = (Hello)ois.readObject();
3. : Field , (class.getDeclaredFields), Method , (class.getDeclaredMethods); Constructor , (class.getDeclaredConstructors)。
4. ( ) :
-- : , 。 “ ( )” 。
(1) :
: “ ” “ ”, “ ” , “ ”, ;
(2) : InvocationHandler invoke ;
Spring : , invoke 。 invoke , 。
5. :
(1) :
:
public interface CarFactory {
void sellCar();
}
:
public class CarFactoryImpl implements CarFactory {
@Override
public void sellCar() {
System.out.println("Sell Car");
}
}
:
public class CarProxy implements CarFactory {
private CarFactory target;
@Override
public void sellCar() {
if(target==null){
target=new CarFactoryImpl();
}
target.sellCar();
}
}
:
:
public interface Service {
String selllCar(String carName);
}
:
public class ServiceImpl implements Service {
@Override
public String selllCar(String carName) {
return carName + "is ready!";
}
}
:
public class MyInvocationHandler implements InvocationHandler {
private Object target;
// target
public MyInvocationHandler(Object target){
this.target=target;
}
// invoke , target
@Override
public Object invoke(Object o, Method method, Object[] args) throws Throwable {
System.out.println("Call:"+method.getName());
// (AOP)
// method invoke target
Object result=method.invoke(target,args);
//
return result;
}
}
:
public class TestProxy {
public static void main(String[] args) {
CarFactory carFactory=new CarProxy();
carFactory.sellCar();
//
//
Service service=new ServiceImpl();
InvocationHandler invocationHandler=new MyInvocationHandler(service);
// :1》 ;2》 ;3》 invocationHandler
Service serviceProxy=(Service) Proxy.newProxyInstance(service.getClass().getClassLoader(),service.getClass().getInterfaces(),invocationHandler);
System.out.println(serviceProxy.selllCar("Aston Martin"));
}
}