反射总结

来源:互联网 发布:网络斗牛赌博作弊器 编辑:程序博客网 时间:2024/06/05 22:31

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 nameclass java.lang.String genderint 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.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic 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
0 0
原创粉丝点击