利用java反射调用类的属性和方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用java反射调用类的属性和方法相关的知识,希望对你有一定的参考价值。

十一结束了,盼望着的十一要做的事情也没有做成。有时候的预期和现实总是有些许的变故,Economic freedom--闲扯结束。今天,就简单点。

一、定义

java反射:程序运行时,通过反射获取类的所有属性和方法, 动态创建对象,调用对象的属性和方法。

二、Method

        是位于java.lang.reflect包下
        在java反射中
        共有四种方法:
        1、getMethods();获得类的public类型方法
        2、getMethod(String name, params);获得类的特定方法
        name 参数指定的方法名字、params方法对应的参数
        3、getDeclaredMethods();获取类中所有方法(public、protected、default、private)
        4、getDeclaredMethod(String name, params);获得类的特定方法
        invoke(Object obj, Object arg[]);方法接收的参数必须为对象

三、定义测试类

package com.css.java.learning.massbag;

public class AllMethod {
    /*定义两个私有属性
     */
    private String name;//测试属性获取
    private String sex;//测试获取所有私有属性
    /*定义一个有参,公有构造函数
     */
    public static String youcan(String aa){
        System.err.println("java通过反射操作方法:有参" + aa);
        return "success";
    }
    /*定义一个无参,公有构造函数
     */
    public static void wucan(){
        System.err.println("java通过反射操作方法:无参");
    }

    /*定义一个无参,私有构造函数
     */
    @SuppressWarnings("unused")
    private static void siyou(){
        System.err.println("java通过反射操作方法:私有");
    }
    /*测试私有属性调用和赋值
     */
    @SuppressWarnings("unused")
    private void shuxing(){
        System.err.println(name + "正在利用java反射调用私有属性");
    }
    /*测试私有属性调用和赋值
     */
    @SuppressWarnings("unused")
    private void allshuxingh(){
        System.err.println(name + sex);
    }

}

四、java反射技术的实现

//通过反射操作方法
    public static void main(String[] args) {
        AllMethod test = new AllMethod();
        Class<?> allm =  test.getClass();
        try {

            Method  m;
            /*公有方法调用
             */
            //有参数
            m =  allm.getMethod("youcan", String.class);
            m.invoke(test, "有参数的调用!");//对象和参数
            //无参数
            m =  allm.getMethod("wucan");
            m.invoke(test);
            /*
             * 私有方法调用
             */
            m = allm.getDeclaredMethod("siyou");
            m.setAccessible(true);
            m.invoke(test);
            /*获取私有属性
             * 和私有属性的赋值
             */
            Field filed = allm.getDeclaredField("name");//获取单个私有属性
            //设置访问私有属性权限
            filed.setAccessible(true);
            //调用和设置私有变量属性
            filed.set(test, "测试私有属性赋值");
            m = allm.getDeclaredMethod("shuxing");
            m.setAccessible(true);
            m.invoke(test);

            Field[] fid = allm.getDeclaredFields();//获取所有私有属性
            for (int i = 0; i < fid.length; i++) {
                fid[i].setAccessible(true);//权限访问私有属性
                fid[i].set(test, i + "测试20181008");
            }
            m = allm.getDeclaredMethod("allshuxingh");
            m.setAccessible(true);//权限访问私有方法
            m.invoke(test);

        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

五、测试结果

技术分享图片

以上是关于利用java反射调用类的属性和方法的主要内容,如果未能解决你的问题,请参考以下文章

Java中的反射该如何使用?

JAVA---反射

如何利用java反射构造一个类,使之实现一个接口和一些功能

Java之反射 — 用法及原理

如何利用java的反射机制动态创建对象

java中的反射机制浅析