反射机制定义
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。
反射机制获取类的三种方式
1.类名.class
//通过类名.class获取类信息
Class c = Car.class;
//获取类方法
Method[] methods = c.getMethods();
//打印方法名称
for(Method method : methods){
System.out.println(method.getName());
}
2.通过对象的getClass()方法获取
//创建对象实例
Car car = new Car();
//通过对象的getClass()方法获取类信息
Class c = car.getClass();
//获取类的构造函数
Constructor[] con = c.getConstructors();
//打印构造函数的名称
for(Constructor cc:con){
System.out.println(cc.getName());
}
3.通过全类名获取Class.forName()
//通过全类名Class.forName获取类信息
Class c = Class.forName("classDemo.Car");
//通过class中的netInstance()方法实例化Car对象
Car o = (Car)c.newInstance();
//调用car对象中的test()方法
o.test();
使用场景
跨网络的远程平台创建和运行对象的能力,即远程方法调用(RMI)
逆向工程
基于注解实现的框架
动态代理
代理:基本的设计模式之一,它是为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。
代理通常充当着中间人的角色。
public interface objectDemo {
public void doSomething();
}
/**
* 被代理实现类
* @author liumengxi
*
* 2017-12-31
*/
public class objectDemoImpl implements objectDemo {
@Override
public void doSomething() {
System.out.println("objectDemoImpl");
}
}
/**
* 代理实现类
* @author liumengxi
*
* 2017-12-31
*/
public class proxyObjectDemoImpl implements objectDemo {
private objectDemoImpl dl;
public proxyObjectDemoImpl(objectDemoImpl dl){
this.dl = dl;
}
@Override
public void doSomething() {
System.out.println("proxyObjectDemoImpl dosomething....");
dl.doSomething();
}
}
/**
* 测试
* @author liumengxi
*
* 2017-12-31
*/
public class proxyObjectMain {
public static void consumer(objectDemo od){
od.doSomething();
}
/**
* @param args
*/
public static void main(String[] args) {
//执行被代理类方法
consumer(new objectDemoImpl());
//执行代理类方法
consumer(new proxyObjectDemoImpl(new objectDemoImpl()));
}
}
动态代理:动态的创建代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的对策。
/**
* 动态代理
* @author liumengxi
*
* 2017-12-31
*/
public class DynamicProxyHandler implements InvocationHandler {
private Object proxid;
public DynamicProxyHandler(Object proxid){
this.proxid = proxid;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//mthod.invoke将请求转发给被代理对象执行
return method.invoke(proxid, args);
}
}
/**
* 测试
* @author liumengxi
*
* 2017-12-31
*/
public class proxyObjectMain {
public static void consumer(objectDemo od){
od.doSomething();
}
/**
* @param args
*/
public static void main(String[] args) {
//执行被代理类方法
objectDemoImpl od = new objectDemoImpl();
consumer(od);
/**
* 创建动态代理
* Proxy.newProxyInstance()可以创建动态代理
* 以下为newProxyInstance参数
* objectDemo.class 类加载器
* new Class[]{objectDemo.class} 该代理实现的接口
* DynamicProxyHandler InvocationHandler接口的一个实现
*/
objectDemo o = (objectDemo) Proxy.newProxyInstance(objectDemo.class.getClassLoader(),
new Class[]{objectDemo.class}, new DynamicProxyHandler(od));
consumer(od);
}
}
更多原创文章请查看地址 https://www.mxblog.com.cn 更多精品资源查看 天天精品
更多免费互联网架构书籍、大厂技术分享书籍、每年Java经典面试宝典可查看编程语言书籍下载