Java反射是一種Java語言的特性,通過反射可以在運行時加載、操作、修改類及其成員。Java反射主要被用于以下方面:
1.動態代理:
反射能夠創建動態代理對象,從而可以在運行時動態的進行業務邏輯增強和擴展。
public interface Foo{ void doSomething(); } public class FooImpl implements Foo{ public void doSomething(){ System.out.println("Do something..."); } } InvocationHandler handler=new InvocationHandler(){ Object object; { object=new FooImpl(); } public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ Object result=method.invoke(object,args); System.out.println("After method call..."); return result; } }; Foo foo=(Foo)Proxy.newProxyInstance(FooImpl.class.getClassLoader(),new Class[]{ Foo.class },handler); foo.doSomething();
2.注解處理器:
反射可以在運行時獲取類信息及其中注解信息,這使得我們可以在運行時通過注解信息對代碼進行加工、優化、增強或修改。
public class MyClass{ @MyAnnotation("Hello") public void doSomething(){ System.out.println("Do something..."); } } public class MyAnnotationProcessor{ public void processAnnotations(Object object){ Class>clazz=object.getClass(); Method[] methods=clazz.getDeclaredMethods(); for(Method method:methods){ MyAnnotation annotation=method.getAnnotation(MyAnnotation.class); if(annotation!=null){ System.out.println(annotation.value()); } } } } MyClass myClass=new MyClass(); MyAnnotationProcessor processor=new MyAnnotationProcessor(); processor.processAnnotations(myClass);
3.工廠模式:
反射可以根據類的名稱動態創建對象,并將其用作工廠生產出其他對象。
public interface Animal{ void say(); } public class Dog implements Animal{ public void say(){ System.out.println("Wang Wang~"); } } public class Cat implements Animal{ public void say(){ System.out.println("Miao Miao~"); } } public class AnimalFactory{ public static Animal getInstance(String className) throws Exception{ Class>clazz=Class.forName(className); return (Animal)clazz.newInstance(); } } Animal dog=AnimalFactory.getInstance("com.example.Dog"); Animal cat=AnimalFactory.getInstance("com.example.Cat"); dog.say(); cat.say();
Java反射的實現,主要通過java.lang.Class類和java.lang.reflect包中的相關類進行實現。