java学习笔记之反射

**本文来自我的OneNote笔记**

Java 能够反射的前提:已经加载过这个类就可以通过类名来寻找到这个类的所有相关信息
Java Reflection
 
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
 
Java 反射机制提供的功能
 
在运行时判断任意一个对象所属的类
 
在运行时构造任意一个类的对象
 
在运行时判断任意一个类所具有的成员变量和方法
 
在运行时调用任意一个对象的成员变量和方法
 
生成动态代理

 

在 Object 类中定义了以下的方法,此方法将被所有子类继承

 

 

 

 

:public final Class getClass ()

 

反射可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Cass 类型的对象。个 Class 对象包含了特定某个类的有关信息。Class 本身也是一个类 Class 对象只能由系统建立对象
 
一个类在 JVM 中只会有一个 Class实例
 
一个 Class)对象对应的是一个加载到 JVM 中的一个.class 文件
每个类的实例都会记得自己是由哪个 Class 实例所生成
通过 Classi 可以完整地得到一个类中的完整结构

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

获取所在的包:getPacage

 

 

 

 

 

 

 

 

 

Proxy:专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态地生成实现类

 

 

 示例代码:

publicclassTestDemoimplementsMyTest {
    @Override publicvoidtest() {
        System.out.println("Operatemethodone");
    }
    @Override publicvoidtest2() {
        System.out.println("Operatemethodtwo");
    }
}
importjava.lang.reflect.InvocationHandler;
 importjava.lang.reflect.Method;

/**
*动态代理类
*/
 publicclassProxyDemoimplementsInvocationHandler {
    Objectobj;
    //被代理的对象 publicProxyDemo(Objectobj) {
        this.obj=obj;
    }
    @Override publicObjectinvoke(Objectproxy, Methodmethod, Object[]args)throwsThrowable {
        System.out.println(“Method:”+method.getName()+”startstooperate.”);
        Objectresult=method.invoke(this.obj, args);
        //执行的是指定代理对象的指定的方法 System.out.println(“Method:”+method.getName()+”isover.”);
        returnresult;
    }
}
importjava.lang.reflect.InvocationHandler;
 importjava.lang.reflect.Proxy;
 publicclassTest2 {
    publicstaticvoidmain(String[]args) {
        MyTesttest=newTestDemo();
        //用接口类型接收, 对象的多态
        /**
*注意:若一个对象想要通过Proxy.newProxyInstance方法被代理
*那么这个类一定要有相应的接口
*就像本例中的Mytest接口和TestDemo实现类
*/
        test.test();
        test.test2();
        System.out.println(“============================“);
        /**
*需求:
*
*在执行test1和test2方法时需要加入一些东西
*在执行方法前打印开始执行
*执行方法后打印执行完毕
*/
        /**
*参数一为代理对象的类加载器
*参数二是被代理对象的接口
*参数三为代理对象
*
*返回的值为成功被代理的对象返回的是object类型,需要根据当时的情况去转换类型
*/
        InvocationHandlerhandler=newProxyDemo(test);
        MyTestt=(MyTest)Proxy.newProxyInstance(handler.getClass().getClassLoader(), test.getClass().getInterfaces(), handler);
        t.test();
        System.out.println(“————————“);
        t.test2();
    }
}

 

posted @ 2021-07-01 11:18  喵团  阅读(45)  评论(0)    收藏  举报