• 反射



    反射方法总结
    类是Class的对象
    第一种方式:
    Class clazz=Class.forName("demo4.UserInfo")
    第二种方式:
    Class clazz=UserInfo.class
    第三种方式:
    Class clazz=new UserInfo().getClass();

    --常见方法总结:
    clazz.getPackage() 返回值是Package对象,获取包
    clazz.getName() 返回值String,获取完整类名
    clazz.getSimpleName() 返回值String 获取完整类名
    clazz.getFields/getField(String 字段名) 返回值 Field获取类中的字段(包括父类的)
    clazz.getDeclaredFields/getDeclaredField(String 字段名) 返回值 Field 仅仅获取类的字段
    clazz.getSuperclass() 返回值Class 获取父类
    clazz.getInterfaces() 返回Class[] 获取实现的接口
    clazz.getMethods/getMethod(String 方法名,Class 形参类型) 获取方法(包括父类的方法)
    clazz.getDeclaredMethods/getDeclaredMethod(String 方法名,Class 形参类型) 获取当前类的方法,不包括父类
    method.invoke(Object obj) 执行方法 返回值Object
    method.getReturnType() 返回值Class 获取方法的返回值类型
    method.getParameterTypes() 返回值Class[] 获取方法的形参数组
    field.get(Object) 获取字段的值 返回值Object
    field.set(Object,value) 给字段赋值
    field.getType() 返回值Class 获取字段类型
    field.getModifiers() 获取字段的访问修饰符码 十六进制
    Modifier.toString(int) 将code返回成真实的修饰符 private
    clazz.newInstance():创建类的实例
    clazz.getConstructors(): 返回值Constructor[] 获取类中的所有构造
    clazz.getConstructor(Class) 获取单个构造器 返回值Constructor
    Constructor.newInstance(Object) 运行构造器 返回值是类的实例
    clazz.getAnnotions() Annotion[] 获取所有注解

     

    package Demo4;
    
    import java.io.Serializable;
    
    public class UserInfo implements Serializable,Runnable{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private String name;
        private int age;
        public UserInfo() {
            System.out.println("wu参构造已执行");
        }
        
        public UserInfo(String name, int age) {
            System.out.println("带参构造已执行");
            this.name = name;
            this.age = age;
        }
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        
         public String say(String text){
                return "你好,我叫小张!"+text;
            }
            
            
    }
    package demo4;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.lang.reflect.TypeVariable;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class MyTest {
        public static void main(String[] args) throws Exception {
             //No.1
            Class forName = Class.forName("demo4.UserInfo");
            //        //No.2
            //        Class clazz=UserInfo.class;
            //        //No.3
            //        Class class1 = new UserInfo().getClass();
             getPackageAndClassName(forName);
             System.out.println("-----------------------------------");
             getClassFields(forName);
             System.out.println("-----------------------------------");
             getSuperClassAndInterface(forName);
             System.out.println("-----------------------------------");
             getClassMethod(forName);
             System.out.println("-----------------------------------");
    
             getClassConstructor(forName);
             System.out.println("-----------------------------------");
    
             getClassAnnotion(forName);
    
        }
        
        //包名和类名同时获取
        public static void getPackageAndClassName(Class clazz){
                Package pack = clazz.getPackage();
                System.out.println("包名为:"+pack.getName());
                System.out.println("类的全名为:"+clazz.getName());
                System.out.println("类名:"+clazz.getSimpleName());
        }
        //获取类中的字段
        public static void getClassFields(Class clazz) throws Exception{
               //1、getDeclaredFields() 只能获取当前类的字段
                        Field[] declaredFields = clazz.getDeclaredFields();
                        //不知道类名的情况下也可以创建类的对象
                        Object obj = clazz.newInstance();
                        for (Field field : declaredFields) {
                              field.setAccessible(true);
                              System.out.println(field.getName()); 
                              //取出字段保存的值
                              System.out.println(field.get(obj));
                        }
                        Field field = clazz.getDeclaredField("age");
                        field.setAccessible(true);
                        //给字段赋值
                        field.set(obj, 12);
                       System.out.println("赋值成功!值为:"+ field.get(obj));
                       //获取age字段的数据类型
                       Class<?> type = field.getType();
                       System.out.println("age字段的数据类型是:"+type.getName());
                       //获取访问修饰符
                       int code = field.getModifiers();
                       System.out.println("该字段的访问修饰符是:"+Modifier.toString(code));
          }
            //3:获取类的父类以及实现的接口
            public static void getSuperClassAndInterface(Class clazz){
                    System.out.println("该类的父类是:"+clazz.getSuperclass().getName());
                    System.out.println("该类实现的接口有:");
                    Class[] clazzs = clazz.getInterfaces();
                    for (Class class1 : clazzs) {
                        System.out.println("接口名称:"+class1.getName());
                    }
            }
            //4:获取类中的方法
            public static void getClassMethod(Class clazz) throws Exception{
                   //可以获取从父类继承过来的方法
                    Method[] methods = clazz.getMethods();
                    System.out.println(methods.length);
                    for (Method method : methods) {
                        System.out.println("类和父类的方法有:"+method.getName());
                    }
                    System.out.println("--------------------------------------------------------");
                    //获取当前类的方法
                    Method[] declaredMethods = clazz.getDeclaredMethods();
                    for (Method method : declaredMethods) {
                           System.out.println("该类的方法有:"+method.getName());
                    }
                    //获取单个方法
                    Method method = clazz.getDeclaredMethod("say",String.class);
                    //获取方法的返回值
                    Class  clazzs = method.getReturnType();
                    System.out.println("该方法的返回值是"+clazzs.getName());
                    //获取方法的形参类型
                    Class[] params = method.getParameterTypes();
                    for (Class class1 : params) {
                        System.out.println("形参有:"+class1.getName());
                    }
                    //不知道类名的情况下也可以创建类的对象
                    Object obj = clazz.newInstance();
                    //invoke让method对象执行
                    Object obj1= method.invoke(obj, "我是狗");
                    System.out.println("方法执行后的结果是:"+obj1);
            }
            
            //5:获取构造
            public static void getClassConstructor(Class clazz) throws Exception{
                //获取所有构造器
                  Constructor[] constructors = clazz.getConstructors();
                  for (Constructor constructor : constructors) {
                        System.out.println(constructor.getName());
                  }
                  //获取单个构造器
                  Constructor constructor = clazz.getConstructor(String.class,int.class);
                  //执行构造器,返回类的实例
                  Object obj = constructor.newInstance("呵呵",12);
            }
           //6:获取注解
             public static void getClassAnnotion(Class clazz) throws Exception{
                       Method method = clazz.getDeclaredMethod("getAge");
                       Annotation[] annotations = method.getAnnotations();
                       for (Annotation annotation : annotations) {
                          System.out.println("该方法的注解有:"+annotation.toString());
                    }
             }
    }


  • 相关阅读:
    Android拍照、摄像方向旋转的问题 代码具体解释
    Java 实现桥接(Bridge)模式
    C++标准I/O库:iostream, fstream, sstringstream
    Android 使用 DownloadManager 管理系统下载任务的方法
    JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
    使用c++的cocos2d-x-3.0rc1程序公布apk
    UVA 146 ID Codes(下一个排列)
    C/C++:C++伪函数
    开源项目AndroidUtil-採用Fragment实现TabHost
    系统编程是什么
  • 原文地址:https://www.cnblogs.com/cuixiaomeng/p/7270701.html
Copyright © 2020-2023  润新知