美文网首页
java反射机制小结

java反射机制小结

作者: 小陈已被注册 | 来源:发表于2019-12-06 21:06 被阅读0次

    本文主要从以下几个方面对java反射机制进行总结:

    1. 反射的概念
    2.反射的作用
    3.反射主要类说明
    4.反射实例

    反射的概念

    java反射机制是在运行状态中,能够知道任意类下的所有方法和属性,能够调用任意对象的方法和属性。这种能动态获取方法和属性并调用的机制称反射机制。

    反射的作用

    在日常开发中,有时需要获取并调用第三方平台的某个方法或属性。而这些方法和属性往往只对系统应用或某些类开放,这时需要使用反射技术来解决。当然不是所有对象都能反射成功,比如被反射对象做了访问权限校验。

    反射主要类

    Class类
    getDeclaredMethods() 获取类的所有公有和私有方法
    getMethod(String name, <?>... parameterTypes) 根据给定参数类型去匹配获取类的某个公有方法
    getMethods() 获取类的所有公有方法
    getEnclosingMethod() 获取定义该类的公有方法
    getDeclaredMethod(Stringname, <?>... parameterTypes)根据给定参数类型去匹配获取类的某个公有或私有方法
    getConstructor(<?>... parameterTypes) 根据给定参数类型去匹配获取类的某个公有构造方法
    getConstructors() 获取类的所有公有构造方法
    getDeclaredConstructor(<?>... parameterTypes) 根据给定参数类型去匹配获取类的某个公有或私有构造方法
    getDeclaredConstructors() 根据获取类的全部公有或私有构造方法
    getEnclosingConstructor() 获取定义该类的公有构造方法
    getDeclaredField(String name) 获取指定名称的公有或私有属性;
    getDeclaredFields() 获取所有属性
    getField(String name) 获取指定名称的公有属性
    getFields() 获取所有公有属性

    Constructor类
    newInstance(Object... initargs) 根究指定的参数找到对应的构造函数并实例出对象

    Field类
    getName() 返回由此 Field对象表示的字段的名称
    set(Object obj, Object value) 将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
    get(Object obj) obj表示某个对象,返回指定对象的此Field的值

    Method类
    invoke(Object obj, Object... args) 。obj表示被调用方法的某个对象,args表示调用此方法需要的参数。调用某个对象的Method对象所表示的方法。

    反射实例

    被反射的类

    public class Book{
    
    private final static StringTAG ="BookTag";
    
        private Stringname;
    
        private Stringauthor;
    
        public Objectb;
    
        @Override
    
        public String toString() {
    
           return "Book{" +"name='" +name +'\'' +", author='" +author +'\'' +'}';
    
        }
    
          public Book(){ }
    
          public Book(String name, String author) {
    
            this.name = name;
    
            this.author = author;
    
            class a{
    
                String c;
    
                String d;
    
                public a(){}
    
                public a(String a, String b){
    
                    c = a;
                    d = b;
    
                }
    
                @Override
    
                public StringtoString() {
    
                       return c +"----" +d;
    
                }
    
            }
    
            b =new a();
    
        }
    
          public String getName() {
    
                  return name;
    
          }
    
         public void setName(String name) {
    
                this.name = name;
    
        }
    
         public StringgetAuthor() {
    
              return author;
    
        }
    
       public void setAuthor(String author) {
    
             this.author = author;
    
        }
    
       private String declaredMethod(String index) {
    
             String string =null;
    
            switch (index) {
    
                     case "0":
    
                       string ="I am declaredMethod 1 !";
    
                    break;
    
                  case "1":
    
                     string ="I am declaredMethod 2 !";
    
                  break;
    
                default:
    
             string ="I am declaredMethod 1 !";
    
          }
    
             return string;
    
      }
    
    }
    

    反射类

    public class ReflexClass {
    
    private final static StringTAG ="peter.log.ReflectClass";
    
        // 创建对象
    
        public static void reflectNewInstance() {
    
              try {
    
                 Class classBook = Class.forName("com.reflex.Book");//初始化类对象
    
                Object objectBook = classBook.newInstance();//创建一个实例
    
                Book book = (Book) objectBook;
    
                book.setName("Android进阶之光");
    
                book.setAuthor("刘望舒");
    
                System.out.println(book.toString());
    
            }catch (Exception ex) {
    
                 ex.printStackTrace();
    
            }
    
    }
    
    public static void main(String[] a){
    
              ReflexClass.reflectEnclosingConstructor();
    
    //        ReflexClass.reflectPrivateField();
    
        }
    
    // 反射私有的构造方法
    
        public static void reflectPrivateConstructor() {
    
              try {
    
                 Class classBook = Class.forName("com.reflex.Book");
    
                //获取一个参数个数为2,参数类型均为String类型的构造函数
    
                Constructor declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);
    
                declaredConstructorBook.setAccessible(true);//TRUE表示禁止java语言访问器检查访问
    
    //使用构造函数对象生成实例
    
                Object objectBook = declaredConstructorBook.newInstance("Android进阶之光","test");
    
                Book book = (Book) objectBook;
    
                System.out.println(book.toString());
    
            }catch (Exception ex) {
    
                  ex.printStackTrace();
    
            }
    
    }
    
    // 反射定义内部类的构造方法
    
        public static void reflectEnclosingConstructor() {
    
               try {
    
                Class classBook = Class.forName("com.reflex.Book");
    
                Class cls = ((Book)classBook.getDeclaredConstructor(String.class,String.class)
    
    .newInstance("Android进阶之光","test")).b.getClass();
    
                //获取一个参数个数为2,参数类型均为String类型的构造函数
    
                Constructor declaredConstructorBook = cls.getEnclosingConstructor();
    
                declaredConstructorBook.setAccessible(true);//TRUE表示禁止java语言访问器检查访问
    
    //使用构造函数对象生成实例
    
                Object objectBook = declaredConstructorBook.newInstance("Android进阶之光","test1");
    
                Book book = (Book) objectBook;
    
                System.out.println(book.toString());
    
            }catch (Exception ex) {
    
                 ex.printStackTrace();
    
            }
    
    }
    
    // 反射私有属性
    
        public static void reflectPrivateField() {
    
              try {
    
                Class classBook = Class.forName("com.reflex.Book");
    
                Object objectBook = classBook.newInstance();
    
                Field fieldTag = classBook.getDeclaredField("TAG");//获取指定名称的属性
    
                fieldTag.setAccessible(true);
    
                String tag = (String) fieldTag.get(objectBook);//获取一个指定实例的属性
    
                System.out.println(fieldTag.getModifiers());
    
            }catch (Exception ex) {
    
                 ex.printStackTrace();
    
            }
    
    }
    
    // 反射私有方法
    
        public static void reflectPrivateMethod() {
    
               try {
    
                 Class classBook = Class.forName("com.reflex.Book");
    
                //根据方法名和方法参数的类名生成方法对象
    
                Method methodBook = classBook.getDeclaredMethod("declaredMethod",String.class);
    
                methodBook.setAccessible(true);
    
                Object objectBook = classBook.newInstance();//生成一个对象
    
                String string = (String) methodBook.invoke(objectBook,"0");//根据实例和参数调用方法获取返回值
    
                System.out.println(string);
    
            }catch (Exception ex) {
    
                ex.printStackTrace();
    
            }
    
    }
    }
    

    相关文章

      网友评论

          本文标题:java反射机制小结

          本文链接:https://www.haomeiwen.com/subject/nyxygctx.html