反射机制(一)会用在哪些位置

时间:2022-10-26 20:59:23

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 blocke.printStackTrace();}//实现多态 //Usb usb=new Udisk(); //比较硬编码 //usb.work(); catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.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);

}

总结:反射是反过来访问类的属性,方法......,我们程序员可以更灵活的写好业务功能。