欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

Java的反射用途和實現

錢旭東1年前6瀏覽0評論

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){
Classclazz=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{
Classclazz=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包中的相關類進行實現。