java反射

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

 

 

下面将通过反射获取类的信息

 

 

 

person类

 
 
public class PersonBean {
 
    private String Name;
    private int age;
    private double price;
    private boolean isMarry;
    protected String mobile;
    public String address;
 
    public void setIsMarry(boolean isMarry) {
        this.isMarry = isMarry;
    }
 
    public boolean isMarry() {
 
        return isMarry;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
 
    public void setName(String name) {
        Name = name;
    }
 
    public void setPrice(double price) {
        this.price = price;
    }
 
    public String getAddress() {
 
        return address;
    }
 
    public int getAge() {
        return age;
    }
 
    public String getMobile() {
        return mobile;
    }
 
    public String getName() {
        return Name;
    }
 
    public double getPrice() {
        return price;
    }
}

 

 

反射获取相关代码:

public class Test {
 
    public static void main(String[] args) {
        System.out.println();
        System.out.println("setField:");
        setField();
 
        System.out.println();
        System.out.println("getFields:");
        getFields();
 
        System.out.println();
        System.out.println("invokeMethod:");
        invokeMethod();
 
        System.out.println();
        System.out.println("getMethod:");
        getMethod();
 
    }
 
    /**
     * 调用方法
     */
    private static void invokeMethod() {
        Class clazz = getClass(PersonBean.class.getName());
 
        try {
            Object object = clazz.newInstance();
            System.out.println("age is :"+ (((PersonBean)object).getAge()));
            Method method = clazz.getMethod("setAge", int.class);
            method.invoke(object, 123456);
 
            Method method1 = clazz.getMethod("getAge");
            int age = (int) method1.invoke(object);
            System.out.println("age is :"+ age);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 设置属性
     */
    private static void setField() {
        Class clazz = getClass(PersonBean.class.getName());
        try {
            PersonBean personBean = (PersonBean) clazz.newInstance();
            Field[] fields = clazz.getDeclaredFields();
 
            System.out.println("设置属性:");
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                field.setAccessible(true);
                if (field.getType().equals(int.class)) {
                    field.setInt(personBean, 24);
 
                } else if (field.getType().equals(double.class)) {
                    field.setDouble(personBean, 24);
 
                } else if (field.getType().equals(float.class)) {
 
                } else if (field.getType().equals(boolean.class)) {
                    field.setBoolean(personBean, true);
 
                } else if (field.getType().equals(String.class)) {
                    field.set(personBean, "广州");
                }
 
            }
            System.out.println(personBean.getAge());
            System.out.println(personBean.getAddress());
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 获取所有属性
     */
    private static void getFields() {
        Class clazz = getClass(PersonBean.class.getName());
        Field[] fields = clazz.getDeclaredFields();
 
        System.out.println("属性有:");
        for (int i = 0; i < fields.length; i++) {
            System.out.println(Modifier.toString(fields[i].getModifiers())+" "+fields[i].getType().getSimpleName()+" "+fields[i].getName());
        }
    }
 
    private static String getModifiers(int modifiers) {
        String modifierName;
        Modifier modifier = new Modifier();
        if (modifier.isPublic(modifiers)) {
            modifierName = "public";
        } else if (modifier.isProtected(modifiers)) {
            modifierName = "protected";
        } else if (modifier.isPrivate(modifiers)) {
            modifierName = "private";
        } else {
            modifierName = modifiers+"";
        }
        return modifierName;
    }
 
    /**
     * 获取所有方法
     */
    private static void getMethod() {
        Class clazz = getClass(PersonBean.class.getName());
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method: methods) {
            String methodModifier = getModifiers(method.getModifiers());
            String methodName = method.getName();
            String methodReturnType = method.getReturnType().getName();
            Class<?>[] methodParam = method.getParameterTypes();
 
            String methodParamName = "";
            for (int i = 0; i < methodParam.length; i++) {
                Class param = methodParam[i];
                methodParamName = methodParamName + param.getName() + " arg"+i+",";
            }
            if (methodParamName.length() > 1) {
                methodParamName = methodParamName.substring(0, methodParamName.length()-1);
            }
            methodParamName = "("+methodParamName+")";
 
            System.out.println(methodModifier+" "+methodReturnType+" "+methodName +" "+methodParamName);
        }
    }
 
    /**
     * 获取class对象
     * @param clazzName
     * @return
     */
    private static Class getClass(String clazzName) {
        Class clazz = null;
        try {
            clazz = Clas敏感词orName(clazzName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return clazz;
    }
 
}
输出结果:

全部评论
点赞 回复 分享
发布于 2017-10-22 00:39

相关推荐

06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
2
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务