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();
}
}
浙公网安备 33010602011771号