反射总结

java里面的反射是一个非常好用的东西。

通常情况下,我们使用关键字new,由一个类生成一个对象;而反射是根据已经存在的对象,来获取类里面的内容。

一个类通常由三部分组成,构造器(构造函数)属性方法,通过反射就可以从一个具体的实例获取到类的构造器、属性和方法。

Java的反射机制需要借助四个类来实现,分别是Class(类)、Constructor(构造器)、Field(属性)、Method(方法)。

Demo:

以User类为例,User包含有姓名、性别、年龄三个属性,两个构造函数,get和set方法以及print方法。

public class User {
	
	private String name;//姓名
	private String gender;//性别
	private int age;//年龄
	
	public User(){}
	
	public User(String name,String gender,int age){
		this.name=name;
		this.gender=gender;
		this.age=age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public void print(){
		System.out.println("name:"+name+",gender:"+gender+",age:"+age);
	}

}

main函数:根据User实例,获取了User类信息、构造器、字段信息、方法信息、并执行了print函数。

public class Main {
	
	public static void main(String args[]){
		User user = new User("张三","男",18);
		reflect(user);
	}
	
	public static void reflect(Object obj){
		
		//获取类信息
		Class cl = obj.getClass();
		
		//1.获取构造器
		System.out.println("构造器");
        Constructor[] cons=cl.getConstructors();
        for(Constructor constructor:cons){
        	System.out.println(constructor.toString());
        }
        
        //2.获取字段信息
        System.out.println("字段信息");
        Field[] fields = cl.getDeclaredFields();
        for(Field f : fields){
        	try {   
                f.setAccessible(true); // 设置些属性是可以访问的  
                String type = f.getType().toString(); // 得到此属性的类型  
                String name = f.getName();// 得到属性的名称  
                System.out.println(type+" "+name);
            } catch (Exception e) {  
                e.printStackTrace();  
            }
        }
        
        //3.获取方法信息
        System.out.println("函数信息");
        Method[] methods = cl.getMethods();
        for(Method m : methods){
        	System.out.println(m.toString());
        }
        
        //4.执行函数
        System.out.println("执行函数");
        try{
            Method m = cl.getMethod("print");
            m.invoke(obj);
        }catch(Exception e){
        	e.printStackTrace();
        }  
        
	}

}

执行结果:

构造器
public User()
public User(java.lang.String,java.lang.String,int)
字段信息
class java.lang.String name
class java.lang.String gender
int age
函数信息
public java.lang.String User.getName()
public void User.setName(java.lang.String)
public void User.print()
public void User.setGender(java.lang.String)
public java.lang.String User.getGender()
public int User.getAge()
public void User.setAge(int)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
执行函数
name:张三,gender:男,age:18
posted @ 2016-12-13 10:49  黄大仙爱编程  阅读(107)  评论(0编辑  收藏  举报