Java面接問題集錦------反射メカニズムとエージェントモード

5073 ワード

1.forNameメソッドの役割はclassタイプのオブジェクトを返すことであり、一般的にnewInstance防犯と組み合わせて使用される.
    新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"));
    }
}