java 反射之属性和方法

反射是java被视为动态语言的关键,反射机制允许程序在执行期间借助于反射的API取得任何类的内部信息,并能直接操作操作对象内部属性和方法,
java的反射机制主要提供以下功能
- 在运行的时候构造任意类的对象
- 在运行时候获取任意一个类所具有的成员变量和方法
- 在运行时候调用任何对象的方法
- 生成动态代理

Class 对象获取 Method 的方法:
getDeclaredMethod(String name, Class<?>... parameterTypes) 
getDeclaredMethods() 
getMethod(String name, Class<?>... parameterTypes) 
getMethods() 
Method 对象的方法:
invoke(Object obj, Object... args) 

student 类

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student() {

    }

    private Student(int age) {
        this.age = age;
    }

    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;
    }

    private void testMethod() {
        System.out.println("testMethod has been executed");
    }
}

SeniorStudent 类

public class SeniorStudent extends Student{
    private String department;

    public SeniorStudent()
    {
    }
    public SeniorStudent(String name,int age,String department)
    {
        super(name,age);
        this.department=department;
    }
    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

}

反射Demo

public class ReflectTest {

    public static void main(String args[]) throws Exception {

        Class classStudent = Class.forName("com.hsc.study.Student");
        //只能获取public的方法,包括父类的方法
        System.out.println("------只能获取public的方法,包括父类的方法------");
        Method[] methods = classStudent.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        //只获取当前类声明的方法,包括private
        System.out.println("------只获取当前类声明的方法,包括private------");
        methods = classStudent.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);

        }
        //获取指定方法
        System.out.println("------获取指定方法,要给出参数类型------");
        Method method = classStudent.getDeclaredMethod("setName", String.class);
        System.out.println(method);
        //执行方法
        Object ob = classStudent.newInstance();
        //obj 是指哪个对象,args是指方法的参数
        //public Object invoke(Object obj, Object... args)
        method.invoke(ob, "hsc");
        SeniorStudent SeniorStudent = new SeniorStudent();
        invoke(SeniorStudent, "setName", "test");
        invoke(SeniorStudent, "setName", "test");
        invoke(SeniorStudent, "getName");
        invoke("com.hsc.study.SeniorStudent", "testMethod");
        System.out.println(SeniorStudent.getName());
        reflectField();

    }

    public static Object invoke(Object obj, String methodName, Object... args) throws Exception {

        if (obj == null || methodName == null) {
            return null;
        }
        Class[] paramType = null;
        //取出参数类型
        if (args != null && args.length > 0) {
            paramType = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                paramType[i] = args[i].getClass();
            }
        }
        Method method = null;
        for (Class clazz = obj.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                method = clazz.getDeclaredMethod(methodName, paramType);
            } catch (Exception e) {
            }
            if (method != null) {
                break;
            }
        }
        if (method == null) {
            throw new NoSuchMethodException();
        }
        method.setAccessible(true);
        return method.invoke(obj, args);
    }

    public static Object invoke(String className, String methodName, Object... args) throws Exception {

        if (className == null || methodName == null) {
            return null;
        }
        Class aClass = Class.forName(className);
        Class[] classes = null;
        if (args != null && args.length > 0) {
            classes = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                classes[i] = args[i].getClass();
            }
        }
        Method method = null;
        for (Class clazz = aClass; clazz != Object.class; clazz = clazz.getSuperclass()) {
            try {
                method = clazz.getDeclaredMethod(methodName, classes);
            } catch (Exception e) {
            }
            if (method != null) {
                break;
            }
        }
        if (method == null) {
            throw new NoSuchMethodException();
        }
        method.setAccessible(true);
        return method.invoke(aClass.newInstance(), args);
    }

    /**
     * field 测试
     */
    public static void reflectField() throws Exception {
        Class classStudent = Class.forName("com.hsc.study.Student");
        //只获取当前类声明的Fields,包括private
        System.out.println("------只获取当前类声明的Fields,包括private------");
        Field[] fields = classStudent.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        //获取指定名Field,当前类定义的
        System.out.println("------只获取当前类声明的Fields,包括private------");
        Field field = classStudent.getDeclaredField("name");
        System.out.println(field);
        if (!field.isAccessible()) {
            field.setAccessible(true);
        }
        Student student = new Student();
        student.setName("hsc");
        //获取指定对象的值
        Object vlaue = field.get(student);
        System.out.println("------获取指定对象的值------");
        System.out.println(vlaue);
        //为了某个对象,某一个属性设置值
        System.out.println("------为了某个对象,某一个属性设置值-----");
        field.set(student, "test");
        System.out.println(student.getName());
    }
}

程序的输出:
——只能获取public的方法,包括父类的方法——
public java.lang.String com.hsc.study.Student.getName()
public void com.hsc.study.Student.setName(java.lang.String)
public int com.hsc.study.Student.getAge()
public void com.hsc.study.Student.setAge(int)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
——只获取当前类声明的方法,包括private——
public java.lang.String com.hsc.study.Student.getName()
public void com.hsc.study.Student.setName(java.lang.String)
private void com.hsc.study.Student.testMethod()
public int com.hsc.study.Student.getAge()
public void com.hsc.study.Student.setAge(int)
——获取指定方法,要给出参数类型——
public void com.hsc.study.Student.setName(java.lang.String)
testMethod has been executed
test
——只获取当前类声明的Fields,包括private——
private java.lang.String com.hsc.study.Student.name
private int com.hsc.study.Student.age
——只获取当前类声明的Fields,包括private——
private java.lang.String com.hsc.study.Student.name
——获取指定对象的值——
hsc
——为了某个对象,某一个属性设置值—–
test

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值