• 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();
            }
    
        }
    
    }
  • 相关阅读:
    执行sudo命令时command not found的解决办法
    CentOS7编译安装libc++和libc++abi
    CentOS 7 编译安装clang+llvm
    如何使用 Issue 管理软件项目?
    西门子 S7-300 PLC 从入门到精通的100个经典问题
    PLC_SIM 出现I/O访问错误-技术论坛-工业支持中心-西门子中国
    C# Lambda表达式
    C# Task中的Func, Action, Async与Await的使用
    C#委托的介绍(delegate、Action、Func、predicate)
    委托 你怎么看?
  • 原文地址:https://www.cnblogs.com/fangg/p/5723034.html
Copyright © 2020-2023  润新知