zoukankan      html  css  js  c++  java
  • 获取class对象的三种方法以及通过Class对象获取某个类中变量,方法,访问成员

    public class ReflexAndClass {
    
        public static void main(String[] args) throws Exception {
            
            /**
             * 获取Class对象的三种方式
             * 1 Object ——> getClass();
             * 2 任何数据类型(包括基本数据类型)都有一个静态的class属性
             * 3 通过Class类的静态方法:forName(String  className)(常用)
             * 
             * 
             * 注意:在运行期间,一个类,只有一个Class对象产生。
             * 三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。
             * 一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。
             * @throws Exception 
             */
            //第一種  getClass
            Student stu = new Student();
            Class stuClass1 = stu.getClass();
            System.out.println(stuClass1.getName());
            //第二種 class属性
            Class stuClass2 = Student.class;
            System.out.println(stuClass2==stuClass1);
            //第三種
            try {
                Class stuClass3 = Class.forName("reflex.Student");//student的路径
                System.out.println(stuClass3);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            
           /**通过Class对象可以获取某个类中的:构造方法、成员变量、成员方法;并访问成员;
             * 
             * 1.获取构造方法:
             *         1).批量的方法:
             *             public Constructor[] getConstructors():所有"公有的"构造方法
             *          public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
             *    
             *         2).获取单个的方法,并调用:
             *             public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
             *             public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
             *         
             *             调用构造方法:
             *             Constructor-->newInstance(Object... initargs)
             *         获取私有的构造方法的时候需要使用setAccessible设置访问权限为true才能进行构造,否则出现异常
             */
            
            Class<?> clazz = Class.forName("reflex.Student");
            Constructor[] public1 = clazz.getConstructors();
            System.out.println("公有構造方法");
            for(Constructor con : public1){
                System.out.println(con);
            }
            
            Constructor[] public2 = clazz.getDeclaredConstructors();
            System.out.println("所有構造方法");
            for(Constructor con : public2){
                System.out.println(con);
            }
            
            Constructor con = clazz.getConstructor(null);
            System.out.println("公有無參:" + con);
            
            Constructor cons = clazz.getDeclaredConstructor(String.class);
            System.out.println("所有無參公有構造方法"+cons);
            
            Object name = clazz.getDeclaredConstructor(String.class).newInstance("chen");
            Student s = new Student();
            System.out.println("名稱為:" + name);
                    
            //调用构造方法
            Object obj = con.newInstance();
    //        System.out.println("obj = " + obj);
    //        Student student = (Student)obj;
            
        }
        
    }
    public class Student {
        
            //---------------构造方法-------------------
            //(默认的构造方法)
            Student(String str){
                System.out.println("(默认)的构造方法 s = " + str);
            }
            
            //无参构造方法
            public Student(){
                System.out.println("调用了公有、无参构造方法执行了。。。");
            }
            
            //有一个参数的构造方法
            public Student(char name){
                System.out.println("姓名:" + name);
            }
            
            //有多个参数的构造方法
            public Student(String name ,int age){
                System.out.println("姓名:"+name+"年龄:"+ age);//这的执行效率有问题,以后解决。
            }
            
            //受保护的构造方法
            protected Student(boolean n){
                System.out.println("受保护的构造方法 n = " + n);
            }
            
            //私有构造方法
            private Student(int age){
                System.out.println("私有的构造方法   年龄:"+ age);
            }
        
    }
  • 相关阅读:
    Code Forces Gym 100886J Sockets(二分)
    CSU 1092 Barricade
    CodeChef Mahesh and his lost array
    CodeChef Gcd Queries
    CodeChef GCD2
    CodeChef Sereja and LCM(矩阵快速幂)
    CodeChef Sereja and GCD
    CodeChef Little Elephant and Balance
    CodeChef Count Substrings
    hdu 4001 To Miss Our Children Time( sort + DP )
  • 原文地址:https://www.cnblogs.com/ch94/p/10287451.html
Copyright © 2011-2022 走看看