您现在的位置是:首页 > 文章详情

Java 反射机制

日期:2018-10-13点击:478

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

 

参考文章:深入理解Java反射
 

代码示例
利用反射机制打印任意一个类

ReflectTest.java

package main;

import java.lang.reflect.*;

import javax.swing.text.html.CSS;

public class ReflectTest {

    private Class thisClass;

    public ReflectTest(Class thisClass) {
        this.thisClass = thisClass;
    }
    
 
    /**
     * 获取类名
     * @return
     */
    private String getName() {
        String className = thisClass.getName();
        
        return className;
    }
 
    /**
     * 获取所有变量
     * @return
     */
    private String getAllField() {
        StringBuilder result = new StringBuilder();
        // 获取所有变量
        Field[] fields = thisClass.getDeclaredFields();
        // 获取公有属性变量的方法:
        // fields = clazz.getFields();
        
        // 循环遍历每个变量
        for (Field field : fields) {
            // 获取变量类型(Class对象),并getName()转为字符串
            String fieldType = field.getType().getName();
            // 获取变量名称
            String fieldName = field.getName();
            // 获取变量修饰符
            int modifierCode = field.getModifiers();
            String accessType = Modifier.toString(modifierCode);
            result.append("    " + accessType + " " + fieldType + " " + fieldName + ";\n\n");
        }
        return result.toString();
    }
    
 
    /**
     * 获取所有方法
     * @return
     */
    private String getAllMethod() {
        StringBuilder result = new StringBuilder();
        // 获取所有方法
        Method[] methods = thisClass.getDeclaredMethods();
        // 获取公有属性方法的方法:
        // methods = clazz.getMethods();
        
        // 循环遍历每个方法
        for (Method method : methods) {
            // 获取方法返回类型(Class对象),并getName()转为字符串
            String methodType = method.getReturnType().getName();
            // 获取方法名称
            String methodName = method.getName();
            // 获取方法修饰符
            int modifierCode = method.getModifiers();
            String accessType = Modifier.toString(modifierCode);
            // 获取方法的所有参数
            Parameter parameters[] = method.getParameters();
            result.append("    " + accessType + " " + methodType + " " + methodName + "(");
            // 循环遍历该方法的所有参数
            for (int i = 0; i < parameters.length; i++) {
                Parameter parameter = parameters[i];
                // 获取参数类型,并转为字符串
                String paramType = parameter.getType().toString();
                // 获取参数名称
                String paramName = parameter.getName();
                result.append(paramType + " " + paramName);
                if (i != parameters.length - 1) {
                    result.append(", ");
                }
            }
            result.append(")\n\n");
        }
        return result.toString();
    }
    
    /**
     * 获取所有构造方法
     * @return
     */
    public String getAllConstructors() {
        StringBuilder result = new StringBuilder();
        // 获取所有构造方法
        Constructor[] constructors = thisClass.getDeclaredConstructors();
        // 获取公有属性构造方法的方法
        // constructors = clazz.getConstructors();
        
        // 循环遍历每个构造方法
        for (Constructor constructor : constructors) {
            // 获取构造方法的名称
            String constructorName = constructor.getName();
            // 获取构造方法的修饰符
            int modifierCode = constructor.getModifiers();
            String accessType = Modifier.toString(modifierCode);
            // 获取构造方法的所有参数
            Parameter[] parameters = constructor.getParameters();
            result.append("    " + accessType + " " + constructorName + "(");
            
            //循环遍历每个参数
            for (int i = 0; i < parameters.length; i++) {
                Parameter parameter = parameters[i];
                // 获取参数类型,并转为字符串
                String paramType = parameter.getType().getName();
                // 获取参数名称
                String paramName = parameter.getName();
                result.append(paramType + " " + paramName);
                if (i != parameters.length - 1) {
                    result.append(", ");
                }
            }
            result.append(")\n\n");
        }
        return result.toString();
    }
    
    @Override
    public String toString() {
        String result = new StringBuilder()
                .append(getName() + " {\n\n")
                .append(getAllField())
                .append(getAllConstructors())
                .append(getAllMethod() + "\n}")
                .toString();
        return result;
    }
 
    public static void main(String args[]) {
        Student s1;
        s1 = new Student();
        ReflectTest test = new ReflectTest(s1.getClass());
        System.out.println(test.toString());
    }
}
Student.java

package main;
 
public class Student {
    
    private int id;
    private String name;
    private String sex;
    
    public Student() {
    }
    
    public Student(int id, String name, String sex) {
        
    }
 
    public void setId(int id) {
        this.id = id;
    }
    
    public int getId() {
        return id;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setSex(String sex) {
        this.sex = sex;
    }
    
    public String getSex() {
        return sex;
    }
 
}
原文链接:https://yq.aliyun.com/articles/652435
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章