Tears_fg

导航

JAVA_Reflection1

package com.qf.reflection1;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    private void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

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

    public Student() {
        super();
    }

}

public class Test {

    public static void main(String[] args) {

        try {
            // 使用反射第一步 得到某个类的Class对象
            Class<Student> clazz1 = Student.class;
            Class<?> clazz2 = Class.forName("com.qf.reflection1.Student");
            Student student = new Student();
            Class<?> clazz3 = student.getClass();

            System.out.println("访问类所有属性");
            // clazz1.getDeclaredField("age");// 根据属性名 得到属性值 私有的也能得到
            // clazz1.getField("name");// 只能得到有访问权限的指定属性
            // clazz1.getFields();//得到有访问权限的所有属性
            Field fields[] = clazz1.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field);
            }

            // 通过反射创建Student对象
            // 1,得到无参构造方法
            Constructor<Student> constructor = clazz1.getConstructor();
            // 2,创建对象
            Student stu = constructor.newInstance();
            // 等价于 Student stu = new Student();

            // 调用setName
            // 1,得到setName()
            Method method = clazz1.getDeclaredMethod("setName", new Class[] { String.class });
            // 私有方法需要设置访问权限
            method.setAccessible(true);
            // 2,通过之前的student对象调用setName表示的方法
            method.invoke(stu, new Object[] { "尼古拉斯赵四" });

            // 1,得到getName()
            Method getName = clazz1.getDeclaredMethod("getName", new Class[] {});
            // 2,通过之前的student对象调用getName表示的方法
            Object object = getName.invoke(stu, new Object[] {});
            System.out.println(object);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

 

posted on 2016-07-31 15:00  Tears_fg  阅读(125)  评论(0编辑  收藏  举报