美文网首页
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反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • java反射机制小结

    本文主要从以下几个方面对java反射机制进行总结: 1. 反射的概念2.反射的作用3.反射主要类说明4.反射实例 ...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

网友评论

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

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