JAVA 反射机制(Java Reflection)总结(一)

来源:互联网 发布:python argv 编辑:程序博客网 时间:2024/06/06 00:03

一、先看一看,百度百科给Java Reflection所下的定义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

什么意思呢?可以简单理解为,通过类名,得到类中的方法和属性;用一个对象来获取它的方法和属性

二、反射用到的类

    java.lang.Class,    java.lang.reflect.*

三、小试牛刀

//创建一个类,用于测试package com.liu.bao;public class Student {    private String name;    private int age;    private String address;    public Student() {    }    public Student(String name, int age, String address) {        this.name = name;        this.age = age;        this.address = address;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }}
1 获取类
//1、getClass()方法Student student = new Student();Class c1 = student.getClass();//2、静态方法 forName()Class c2 = Class.forName("com.liu.bao.Student");//3、对于一个已定义的类型,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象Class c3 = Student.class;
2 创建对象
Class class = Class.forName("com.liu.bao.Student");Object o = class.newInstance();//调用无参构造方法,重写构造方法时,必需写一个无参构造
3 获取属性字段
Class c = Class.forName("com.liu.bao.Student");         Field[] fs = c.getDeclaredFields(); //获取所有的属性 (getFields()方法只能获得public属性)                   StringBuffer sb = new StringBuffer(); sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); // Modifier.toString(c.getModifiers()) 获取修饰符     c.getSimpleName()获取类名for(Field field:fs){      sb.append("\t");//空格      sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等      sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字      sb.append(field.getName()+";\n");//属性的名字+回车  } sb.append("}");  System.out.println(sb);//输出结果如下:public class Student{    private String name;    private int age;    private String address;} 
4 获取构造方法
    Class c = Class.forName("com.liu.bao.Student");     Constructor[] constructors = c.getConstructors();            for(Constructor constructor:constructors) {                System.out.println(constructor);            }//输出结果如下:public com.liugan.baojun.Student()public com.liugan.baojun.Student(java.lang.String,int,java.lang.String)
5 获取方法
        Class c = Class.forName("com.liu.bao.Student");         Method[] methods = c.getDeclaredMethods();         StringBuffer sb = new StringBuffer();                 sb.append(Modifier.toString(c.getModifiers())+" "+"class"+ " " + c.getSimpleName()+"{\n");        for (int i = 0; i < methods.length; i++) {//外层循环,获取所有的方法            sb.append("\t"+Modifier.toString(methods[i].getModifiers())+" ");            sb.append(methods[i].getReturnType().getSimpleName()+" ");            sb.append(methods[i].getName()+"(");            Parameter[] parameters = methods[i].getParameters();            for (int j = 0; j < parameters.length; j++) {//内层循环,获取某方法所有参数类型                sb.append(parameters[j].getType().getSimpleName()+" "+"arg"+j);                if(j<parameters.length-1) {                    sb.append(", ");                }            }            sb.append("){}\n");        }        sb.append("\n}");        System.out.println(sb);//输出结果如下:public class Student{    public String getAddress(){}    public String getName(){}    public void setName(String arg0){}    public int getAge(){}    public void setAge(int arg0){}    public void setAddress(String arg0){}}
原创粉丝点击