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);
            }
        
    }
  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/ch94/p/10287451.html
Copyright © 2011-2022 走看看