zoukankan      html  css  js  c++  java
  • 反射机制(reflection)

    一、反射:

    1、反射指可以在运行时加载、探知、使用编译期间完全未知的类。

    2、程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;

    对于任意一个对象,都能调用它的任意一个方法和属性。

    3、加载完类后,在堆内存中产生一个Class类型的对象(一个类只有一个Class对象),这个对象包含完整的类的结构信息。

    通过这个对象看到类的结构。这个对象就像一面镜子,透过镜子看到类的结构,称之为:反射。


    二、作用

    1、动态加载类、动态获取类信息(属性、方法、构造器)

    2、动态构造对象

    3、动态调用类和对象的任意方法、构造器

    4、动态调用和处理属性

    5、获取泛型信息

    6、处理注解


    三、Class类对象

    getClass() 、 Class.forName() 、 .class 语法

    public class Demo01 {
    
    	public static void main(String[] args) {
    		String path = "cn.lhl.Test.bean.User";
    		
    		try {
    			Class clazz = Class.forName(path);
    			//对象是表示和封装一些数据。
    			//一个类被加载后,JVM会创建一个对应的Class对象,类的全部结构会放到对应的Class对象中。
    			//通过Class看到对应类的信息
    			System.out.println(clazz);
    			
    			Class clazz1 = String.class;
    			Class clazz2 = int.class;
    			
    			Class clazz3 = path.getClass();
    			
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    	}
    }
    

      

    三、操作,获取类信息

    
    
    package cn.lhl.Test;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     *通过反射的API ,获取类的信息
     * 
     * @author Administrator
     *
     */
    public class Demo02 {
    	public static void main(String[] args) {
    		String path = "cn.lhl.Test.bean.User";
    		
    		try {
    			Class clazz = Class.forName(path);
    			
    			//获取类的名字
    			System.out.println(clazz.getName());//包名和类名
    			System.out.println(clazz.getSimpleName());//类名
    			
    			//获取属性信息
    		//	Field[] fields = clazz.getFields();//只能获得public的field
    			Field[] fields = clazz.getDeclaredFields();//获得所有的field
    			Field f = clazz.getDeclaredField("uname");
    			System.out.println(fields.length);
    			for(Field temp:fields) {
    				System.out.println(temp);
    			}
    			
    			//获取方法信息
    			Method[] methods = clazz.getDeclaredMethods();
    			Method m01 = clazz.getDeclaredMethod("getUname", null);
    			Method m02 = clazz.getDeclaredMethod("setUname", String.class);//如果有参,必须传递参试类型对应的class对象
    			for(Method m:methods) {
    				System.out.println(m);
    			}
    			
    			//获取构造器信息
    			Constructor[] constructors = clazz.getDeclaredConstructors();//所有构造
    			Constructor c = clazz.getDeclaredConstructor(null);//空构造
    			Constructor c1 = clazz.getDeclaredConstructor(int.class,int.class,String.class);//有参构造
    			for(Constructor temp:constructors) {
    				System.out.println(temp);
    			}
    			
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    	}
    	
    }
    

      


    package cn.lhl.Test;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    import cn.lhl.Test.bean.User;
    
    /**
     *通过反射API动态操作:构造器、方法、属性 
     * @author Administrator
     *
     */
    public class Demo03 {
    	public static void main(String[] args) {
    		String path = "cn.lhl.Test.bean.User";
    		
    		try {
    			Class<User> clazz = (Class<User>) Class.forName(path);
    			
    			//通过反射API调用构造方法,构造对象
    			User u = clazz.newInstance();  //调用了User无参构造方法
    			System.out.println(u);
    			
    			Constructor<User> c = clazz.getDeclaredConstructor(int.class,int.class,String.class);
    			User u1 = c.newInstance(100,18,"华哥");
    			System.out.println(u1.getUname());
    			
    			//通过反射API调用普通方法
    			User u2 = clazz.newInstance();
    			Method method = clazz.getDeclaredMethod("setUname",String.class);
    			method.invoke(u2, "华哥二");
    			System.out.println(u2.getUname());
    			
    			//通过反射API操作属性
    			User u3 = clazz.newInstance();
    			Field f = clazz.getDeclaredField("uname");
    			f.setAccessible(true); //这个属性不需要安全检查,可以直接访问,可以提高效率(大概为4倍)
    			f.set(u3, "华哥三");		//通过反射直接写属性
    			System.out.println(u3.getUname());//通过反射直接读取属性的值
    			System.out.println(f.get(u3));
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    	}
    }
    
  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/lhl0131/p/12357587.html
Copyright © 2011-2022 走看看