zoukankan      html  css  js  c++  java
  • 反射

    参考:https://mp.weixin.qq.com/s/GDuqMY7TSicjHpZ4wDz2dA

    获取Class对象的几种方式

    public class MainTest {
        public static void main(String[] args) {        
            Student stu1=new Student();
            Class stuClass=stu1.getClass();
            System.out.println(stuClass.getName());  
        
            Class stuClass2=Student.class;
            System.out.println(stuClass==stuClass2);
            
            try {
                Class stuClass3=Class.forName("com.ref.test.Student");   一般情况下这种方式用的最常见
                System.out.println(stuClass2==stuClass3);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

     参考:https://www.cnblogs.com/rocomp/p/4781987.html

    反射获取构造函数并使用

            
            //1.加载Class对象
            Class clazz = Class.forName("com.ref.test.Student");
            
            System.out.println("所有公有构造方法");
            java.lang.reflect.Constructor[] constructors=clazz.getConstructors();
            
            System.out.println("所有的构造方法(包括:私有、受保护、默认、公有)");
            constructors=clazz.getDeclaredConstructors();
            
            System.out.println("获取公有、无参的构造方法");
            java.lang.reflect.Constructor con= clazz.getConstructor();
            //获取某个公有的构造函数
           java.lang.reflect.Constructor  cons1=clazz.getConstructor(String.class);
           
           //获取某个构造函数
           java.lang.reflect.Constructor cons2=clazz.getDeclaredConstructor(String.class,Integer.class);

     反射获取字段并使用

            // 1.加载Class对象
            Class clazz = Class.forName("com.ref.test.Student");
            Object obj = clazz.getConstructor().newInstance();
    
            // 获取指定字段,但是只能获取公有的字段
            Field field1 = clazz.getField("name");
            field1.set(obj, "123");
            System.out.println(obj.toString());
    
            Field field2 = clazz.getDeclaredField("phoneNum"); // 获取指定名称的字段(在所有中查找)
            System.out.println(field2);   这里获取到私有字段在类外是不能进行任何操作赋值取值操作的
            System.out.println("*****************");  
    
            Field[] fields = clazz.getFields(); // 这里只能取到公有的字段
            for (Field field : fields) {
                System.out.println(field);
            }
            System.out.println("******************");
            Field[] fields2 = clazz.getDeclaredFields();// 这里可以取到所有的字段
            for (Field field : fields2) {
                System.out.println(field);
            }

     反射获取方法并调用

            // 1.加载Class对象
            Class clazz = Class.forName("com.ref.test.Student");
            Object obj = clazz.getConstructor().newInstance();
            
            Method method1=clazz.getMethod("show1", String.class);
            method1.invoke(obj, "123");
            
            Method method2=clazz.getDeclaredMethod("show2");
            method2.invoke(obj);
            
            //获取所有的成员方法,包括私有的(不包括继承的
            Method[] methods1=clazz.getDeclaredMethods();
        
            //获取所有的公有的方法,包括继承父类的公有方法
            Method[] methods2=clazz.getMethods();

      

  • 相关阅读:
    Structed Exception Handler 学习总结(五)
    Structed Exception Handler 学习总结(四)
    Structed Exception Handler 学习总结(三)
    Structed Exception Handler 学习总结(二)
    Structed Exception Handler 学习总结(一)
    关于模板的思考
    java中的exception与c++中的exception比较
    java中的exception
    在控制台(Console)环境下编译Windows GUI程序
    关于字符串的内存分配问题
  • 原文地址:https://www.cnblogs.com/yanliang12138/p/10240338.html
Copyright © 2011-2022 走看看