java反射机制小结

本文主要从以下几个方面对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反射机制小结)