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

一、先看一看,百度百科给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){}

}

猜你喜欢

转载自blog.csdn.net/every__day/article/details/77151309