java反射机制应用概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
一:在运行时调用任意一个对象的方法——生成动态代理
下面这行代码是在运行中换了调用的方法,实现了多态;
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入实现Usb类名:按实现类名的方法执行");
String cname=input.next(); //Udisk,keyborad,usb,cd.....
try {
Class c= Class.forName("反射应用."+cname);//返回与带有给定字符串名的类或接口相关联的 Class
对象
Usb usb=(Usb)c.newInstance();//确定此对象所表示的类或接口实现的接口。
usb.work();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//实现多态
//Usb usb=new Udisk(); //比较硬编码
//usb.work();
catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
二:获取对应的运行时类的完整的类的结构:属性、方法、构造器、包、父类、接口、泛型、注解、异常、内部类。。。
//1.创建对象 Object o=c.newInstance(); //2.获取类的所有属性(Field) Field [] fields=c.getDeclaredFields(); for (Field field : fields) { System.out.println("属性名是:"+field.getName()); } //3.获取类中所有的方法 Method []methods=c.getDeclaredMethods(); for (Method method : methods) { System.out.println("方法名是:"+method.getName()); } //4.属性赋值 Field fname=c.getDeclaredField("name"); fname.set(o, "张三"); Field fage=c.getDeclaredField("age"); fage.set(o, 21); //5.调用方法 Method method=c.getDeclaredMethod("show", null); Object returnvalue=method.invoke(o, null); System.out.println("值是:"+returnvalue);
三:调用对应的运行时类中指定的结构(某个指定的属性、方法、构造器)(重点)
//调用指定属性 @Test public void test3() throws Exception{ Class clazz = Class.forName("com.atguigu.review.Animal"); Object obj = clazz.newInstance(); Animal a = (Animal)obj; //调用非public的属性 Field f1 = clazz.getDeclaredField("name"); f1.setAccessible(true); f1.set(a, "Jerry"); //调用public的属性 Field f2 = clazz.getField("age"); f2.set(a, 9); System.out.println(f2.get(a)); System.out.println(a); //调用static的属性 Field f3 = clazz.getDeclaredField("desc"); System.out.println(f3.get(null)); } //调用指定的方法 @Test public void test4() throws Exception{ Class clazz = Class.forName("com.atguigu.review.Animal"); Object obj = clazz.newInstance(); Animal a = (Animal)obj; //调用非public的方法 Method m1 = clazz.getDeclaredMethod("getAge"); m1.setAccessible(true); int age = (Integer)m1.invoke(a); System.out.println(age); //调用public的方法 Method m2 = clazz.getMethod("show", String.class); Object returnVal = m2.invoke(a,"金毛"); System.out.println(returnVal); //调用static的方法 Method m3 = clazz.getDeclaredMethod("info"); m3.setAccessible(true); // m3.invoke(Animal.class); m3.invoke(null); }
总结:反射是反过来访问类的属性,方法......,我们程序员可以更灵活的写好业务功能。
时间: 2024-11-08 22:44:46