首页 > 代码库 > 反射机制(一)会用在哪些位置

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

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);
    
}

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

  

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