1.什么是反射
程序可以访问、检测和修改本身状态或行为的一种能力。
2.反射的优缺点
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多
态的应用,有以降低类之间的藕合性。
优点:可以实现动态创建对象和编译,体现出很大的灵活性;
缺点:对性能有影响,使用反射基本是一种解释操作,这类操作总是慢与直接操作
3.反射的功能
在运行时判断任意一个对象所属的对象类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法,通过反射甚至调用到private 方法。
生成动态代理。
(动态代理的原理就是,在程序运行时根据需要动态创建目标类的代理对象。需要实现InvocationHandler接口,
Proxy类:提供创建动态代理类和实例的静态方法)
4.Java 反射的API
Java.lang.Class类和Java.lang.reflect包中的Field、Constructor、Method、Array类
Class类:Class类的实例是表示正在运行的Java应用程序中的类和接口。
Field类: 提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的解释,可以把它看成一个封装反射类的属性的类
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类与Field类不同,Field类封装了反射类的属性,而Constuctor类封装了反射类的构造方法。
Method类:提供关于类或接口上单独某个方法的信息。它用来封装反射类方法的一个类。
Array类:提供了动态创建数组和访问数组的静态方法。该类中所有方法都是静态方法。
动态代理的小Demo
public interface ClothingFactory {
/*有生产一批衣服的功能*/
void productClothing();
}
/**目标类*/
public class LiNingCompany implements ClothingFactory{
/**LiNing公司就是一家能生产服装的公司*/
public void productClothing() {
System.out.println("生产一批LiNing的服装");
}
}
/**动态代理的处理类*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyHandler implements InvocationHandler{
/*目标对象*/
private Object object;
/*创建一个目标对象的代理对象*/
public Object newProxyInstance(Object object){
this.object=object;
System.out.println("newProxyInstance");
return Proxy.newProxyInstance(this.object.getClass().getClassLoader(), this.object.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=null;
try{
System.out.println(method.getName());
//目标对象上的方法调用之前可以添加其他代码
System.out.println("invoke");
result=method.invoke(this.object, args);
System.out.println("after invoke");
//通过反射来调用目标对象上的对应方法
//目标对象上的方法调用之后可以添加其他代码
}catch(Exception e){
throw e;
}
return result;
}
}
/**客户类*/
public class Customer {
public static void main(String[] args){
//通过中介公司生产一批服装
//
ClothingFactory cf=new ProxyCompany(new LiNingCompany());
//
cf.productClothing();
DynamicProxyHandler handler=new DynamicProxyHandler();
ClothingFactory cf=(ClothingFactory) handler.newProxyInstance(new LiNingCompany());
cf.productClothing();
}
}
在控制台打出来的结果:
newProxyInstance
productClothing
invoke
生产一批LiNing的服装
after invoke