博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射
阅读量:5303 次
发布时间:2019-06-14

本文共 5168 字,大约阅读时间需要 17 分钟。

public class Student {    private String name = "小黑黑";    public Integer age;    protected Date birthday;    int num;    static {        System.out.println("student的静态代码块");    }    public static void testStudent() {        System.out.println("这是静态方法....");    }    // 私有的方法    private int getNum(int num) {        return num + 10;    }    /*     * 在获取 私有属性值的时候 需要注释掉 private Student() {     * System.out.println("这是Student无参构造"); }     */    public Student() {        System.out.println("这是Student无参构造");    }    public Student(String name, int age, Date birthday) {        System.out.println("这是Student带参构造");        this.name = name;        this.age = age;        this.birthday = birthday;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }}
Student

 

public class ReflectTest { // 反射    /**     * 所有类的对象 都是Class的实例     * 所有类的父类都是Object     */    @Test    public void getClassName() {        Student stu = new Student();        System.out.println(stu.getClass().getSuperclass());        System.out.println(Student.class.getSuperclass());        System.out.println(String.class.getSuperclass());        System.out.println(Integer.class.getSuperclass().getSuperclass());    }    // 三种方式 获取 指定类的 完整限定名    @Test    public void getClazz() throws Exception {        System.out.println(Class.forName("cn.bdqn.test.Student").getName());        System.out.println(new Student().getClass().getName());        System.out.println(Student.class.getName());    }    // 通过反射获取指定类的信息    @Test    public void getMsg() throws Exception {        Class c = Class.forName("cn.bdqn.test.Student");        System.out.println("全类名:" + c.getName());        System.out.println("包名:" + c.getPackage().getName());        System.out.println("类名:" + c.getSimpleName());        int num = c.getModifiers();        System.out.println(num);        System.out.println(Modifier.toString(num));    }    // 通过反射获取属性的信息    @Test    public void getFileds() throws Exception {        Class c = Class.forName("cn.bdqn.test.Student");        // 获取所有public修饰的字段        Field[] fields = c.getFields();        for (int i = 0; i < fields.length; i++) {            System.out.println(fields[i]);        }        System.out.println("获取所有的属性名称****************");        fields = c.getDeclaredFields();        for (int i = 0; i < fields.length; i++) {            System.out.println(fields[i].getName());        }        System.out.println("获取所有属性的修饰符*****************");        // default的int值 是 0        for (int i = 0; i < fields.length; i++) {            System.out.println(Modifier.toString(fields[i].getModifiers()));        }    }    // 通过反射观察执行顺序    @Test    public void getC() throws Exception {        Class c = Class.forName("cn.bdqn.test.Student"); // 加载静态代码块        // Student.testStudent();        // Student student = new Student(); // 耦合 无参构造        Student student = (Student) c.newInstance(); // 解耦合 无参构造    }    // 通过反射获取类中的构造方法    @Test    public void getConstructors() throws Exception {        Class c = Class.forName("cn.bdqn.test.Student"); // 加载静态代码块        Constructor[] constructors = c.getDeclaredConstructors();        for (int i = 0; i < constructors.length; i++) {            System.out.println("构造的修饰符:"                    + Modifier.toString(constructors[i].getModifiers()));            System.out.println("构造的名称:" + constructors[i].getName());            // 1.8才有getParameterCount            System.out                    .println("构造的参数个数:" + constructors[i].getParameterCount());            Class[] types = constructors[i].getParameterTypes(); // 参数的类型            for (Class class1 : types) {                System.out.println("参数的类型:" + class1.getName());                System.out.println("参数的类型简写:" + class1.getSimpleName());            }            System.out.println("******************************");        }    }    // 通过反射获取类中的属性    @Test    public void setFiledName() throws Exception {        Student student = Student.class.newInstance();        Class c = student.getClass();        // 获取指定的属性        Field field = c.getDeclaredField("name");        // 设置属性的访问权限        field.setAccessible(true);        System.out.println(field.get(student));    }    // 通过反射获取类中的构造方法赋值    @SuppressWarnings("unchecked")    @Test    public void getMethod() throws Exception {        Student student = Student.class.newInstance();        Class c = student.getClass();        System.out.println(student.age);        Method method = c.getDeclaredMethod("setAge", Integer.class);        // 执行方法        method.invoke(student, 50);        System.out.println(student.age);        // 执行私有的带有参数的 并且有返回值的方法        method = c.getDeclaredMethod("getNum", int.class);        // 开启方法的权限        method.setAccessible(true);        int num = (Integer) method.invoke(student, 50);        System.out.println(num);    }}

转载于:https://www.cnblogs.com/HHR-SUN/p/7039279.html

你可能感兴趣的文章
JDesktopPane JInternalFrames
查看>>
错误The request sent by the client was syntactically incorrect ()的解决
查看>>
Java基础知识学习(九)
查看>>
redis在windows下总是报错,就是下面的错误,这是哪里出错了
查看>>
Asp.net窄屏页面 手机端新闻列表
查看>>
Linux 密钥验证
查看>>
windows下UDP服务器和客户端的实现
查看>>
MySQL各版本的区别
查看>>
[poj1006]Biorhythms
查看>>
迭代器
查看>>
elasticsearch type类型创建时注意项目,最新的elasticsearch已经不建议一个索引下多个type...
查看>>
jQury 跳出each循环的方法
查看>>
spring AOP 之五:Spring MVC通过AOP切面编程来拦截controller
查看>>
在编译安装程序时候遇到/usr/bin/ld: cannot find -lxxx的时候的解决办法。
查看>>
使用 INSERT 和 SELECT 子查询插入行
查看>>
ubuntu重装mysql
查看>>
English trip -- VC(情景课)1 C What's your name?(review)
查看>>
redirect的错误用法asp.net怎么使用自定义错误
查看>>
在MyEclipse下统计工程的代码(package、行数、类个数)
查看>>
Erlcron分析学习
查看>>