反射的定义:在运行状态时(动态的),对于任意一个类,都能够得到这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意属性和方法。这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制.
反射的三种用法
public class ClassDemo02 {
public static void main(String[] args) {
Person p1 = new Person("小明" ,20,‘男‘ );
Person p2 = new Person("小红" ,23,‘女‘ );
//创建Class对象的方式一:(对象.getClass()),获取person类中的字节码文件
Class class1 = p1.getClass();
System. out.println(p1.getClass().getName());
Class class2 = p2.getClass();
System. out.println(class1 == class2 );
System. out.println("==============================" );
//创建Class对象的方式二:(类.class:需要输入一个明确的类,任意一个类型都有一个静态的class属性)
Class class3 = Person.class;
System. out.println(class1 == class2);
System. out.println("==============================" );
//创建Class对象的方式三:(forName():传入时只需要以字符串的方式传入即可)
//通过Class类的一个forName(String className)静态方法返回一个Class对象,className必须是全路径名称;
//Class.forName()有异常:ClassNotFoundException
Class class4 = null;
try {
class4 = Class.forName("cn.itcast.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System. out.println(class4 == class3);
}
}
对于JDK动态代理,其必须要有接口
代码案例
接口
package bjpowernode;
public interface HelloService {
void sayhello(String name);
}
方法HelloServiceimpl
package bjpowernode.Service;
import bjpowernode.HelloService;
public class HelloServiceimpl implements HelloService {
@Override
public void sayhello(String name) {
System.out.println("你好:"+name);
}
}
被代理的方法TestApp
package bjpowernode;
import bjpowernode.Service.HelloServiceimpl;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestApp {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
HelloService service = new HelloServiceimpl();
service.sayhello("zhangsan");
//使用反射机制执行sayhello方法
HelloService target = new HelloServiceimpl();
//获取hello名称对饮的Method类对象
//关于.class.getMethod()方法:作用是获得对象所声明的公开方法,该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。
//在sayhello方法中,方法的类型是String,因此第二个参数为String.class
Method method = HelloService.class.getMethod("sayhello", String.class);
//通过method可以调用sayhello方法
//表达的意思是method方法执行的对象是sayhello,参数是李四
method.invoke(target,"李四");
}
}
原文:https://www.cnblogs.com/hello-liu/p/14811300.html