反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。
2.1 概述
Class对象是反射的起点,可以利用类的Class对象创建类的实例(newInstance),同时提供了操作类的工具,可以获取类的详细信息,并且使用特殊的技术实现类的加载(运行时加载,在编译的时候还没有该类的class文件)。
2.2 Class对象的获取方式
3.1概述
Class对象提供了很多获取类信息的工具,可以获取类的方法,属性,进行类型判断,创建类的对象实例等等。
3.2 相关API介绍
public class Main { public static void main(String[] atgs) throws ClassNotFoundException { printTypeInfo("MyClass"); } /**
获取类的构造函数
*/ public static void printTypeInfo(String className){ try { Class<?> c = Class.forName(className); Constructor<?>[] constructors=c.getConstructors(); for(Constructor<?> constructor:constructors){ System.out.println(constructor); } }catch(ClassNotFoundException e){ e.printStackTrace(); } } } class MyClass { private int num=10; public MyClass(int num){ this.num=num; } public MyClass(){ } @Override public String toString(){ return String.format("%d",num); } }
备注:1.使用反射创建类的实例,Class.newInstance(),类中必须又一个无参数的构造函数,否则会报错。
public MyClass()
Constructor<?> constructor=c.getConstructor(int.class); MyClass myClass=(MyClass)constructor.newInstance(5); System.out.println(myClass);
public static void printTypeInfo(String className) { try { Class<?> c=Class.forName(className); for(Method method:c.getMethods()){ System.out.println(method); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
public static void main(String[] args){ Class<?> c=Class.forName(className); Method method=c.getMethod("getInfo",String.class); System.out.println(method.invoke(c.newInstance(),new String("123"))); } class MyClass { private int num=10; public MyClass(int num){ this.num=num; } public MyClass(){ } public String getInfo(String string){ return String.format("get : %s",string); } @Override public String toString(){ return String.format("%d",num); } }
public static void printTypeInfo(String className) { try { Class<?> c=Class.forName(className); Field[] fields=c.getDeclaredFields(); for(Field field:fields){ System.out.println(field); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }
}
field.setAccessible(true); field.set(myClass,123);
public class Main { public static void main(String[] atgs) { proxy proxy=new ProxyServer(new RealServer()); proxy.doSomthing(); } } interface proxy{ void doSomthing(); } class RealServer implements proxy{ @Override public void doSomthing(){ System.out.println("doSomething from RealServer"); } } class ProxyServer implements proxy{ private proxy realServer; public ProxyServer(proxy realServer){ this.realServer=realServer; } @Override public void doSomthing(){ realServer.doSomthing(); } }
import java.lang.reflect.*; /** * Created by yangyun on 2016/11/30. */ public class Main { public static void main(String[] atgs) { myProxy myProxyInterface=(myProxy) Proxy.newProxyInstance( RealServer.class.getClassLoader(), RealServer.class.getInterfaces(), new ProxyHandler(new RealServer()) ); myProxyInterface.doSomthing(); } } interface myProxy{ void doSomthing(); } class RealServer implements myProxy{ public RealServer(){ } @Override public void doSomthing(){ System.out.println("from RealServer doSomething()"); } } class ProxyHandler implements InvocationHandler{ private Object realProxy; public ProxyHandler(Object realProxy){ this.realProxy=realProxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before invoke()"); Object result=method.invoke(realProxy,args); System.out.println("after invoke()"); return result; } }
有什么意义?
https://www.zhihu.com/question/24304289
http://blog.csdn.net/xu__cg/article/details/52882023
http://blog.csdn.net/liujiahan629629/articzle/details/18013523
http://www.cnblogs.com/xiaoluo501395377/p/3383130.html
原文:http://www.cnblogs.com/yangyunnb/p/6126109.html