zoukankan      html  css  js  c++  java
  • Java的反射机制

    反射机制主要提供以下功能: 
    ①在运行时判断任意一个对象所属的类;
    ②在运行时构造任意一个类的对象;
    ③在运行时获取任意一个类所具有的成员变量和方法;
    ④在运行时调用任意一个对象的方法;
    ⑤生成动态代理。(有待扩充)
     
     
    新建一个Test类,继承FTest类: 
     1 public class Test extends FTest{
     2     public int number;
     3     public String name;
     4     
     5     public Test() {
     6     }
     7     
     8     public Test(String name, int number) {
     9         this.number = number;
    10         this.name = name;
    11     }
    12     
    13     public int getNumber() {
    14         return number;
    15     }
    16 
    17     public void setNumber(int number) {
    18         this.number = number;
    19     }
    20 
    21     public String getName() {
    22         return name;
    23     }
    24 
    25     public void setName(String name) {
    26         this.name = name;
    27     }
    28     
    29     public void reflection1() {
    30         System.out.println("函数reflection");
    31     }
    32     
    33     public void reflection2(String num) {
    34         System.out.println("reflection" + num);
    35     }
    36 }

    实例化Class类对象

     1 //实例化Class类对象
     2  Class<?> class1 = null;
     3  Class<?> class2 = null;
     4  Class<?> class3 = null;
     5  try {
     6     //一般有三种方法 一般使用第一种方法
     7     class1 = Class.forName("net.cnblog.muziqiuqiu.Test");
     8     class2 = new Test().getClass();
     9     class3 = Test.class;
    10     } catch (Exception e) {
    11        System.out.println(e);
    12   }

    通过反射机制获取对象的类名、包名、父类、接口

     1 Test test = new Test();
     2 //获取对象的类名和包名
     3 System.out.println(test.getClass().getName());
     4 System.out.println(class1.getName());
     5 //获取对象的父类
     6 System.out.println(test.getClass().getSuperclass());
     7 System.out.println(class1.getSuperclass());
     8 //获取实现的接口(接口可能会有几个)
     9 System.out.println(test.getClass().getInterfaces());
    10 System.out.println(class1.getInterfaces());

    通过反射机制实例化类的对象

     1 //通过反射机制实例化一个类的对象
     2 //第一种方法-通过默认的构造方法实例化一个类的对象
     3 try {
     4     Test test2 = (Test)class1.newInstance();
     5     test2.setName("haha");
     6     System.out.println(test2.getName());
     7 } catch (Exception e) {
     8     System.out.println(e);
     9 }
    10 //第二种方法-通过获取全部的构造函数实例化对象        
    11 Constructor<?> cons[] = class1.getConstructors();
    12 for(int i = 0; i < cons.length; i++) {
    13     Class<?> clazzs[] = cons[i].getParameterTypes();        
    14 }try {
    15     Test test3 = (Test)cons[1].newInstance("haha",1); 
    16   //System.out.println(test3.getName()+test3.getNumber());
    17 } catch (Exception e) {
    18     System.out.println(e);
    19 }

    获取某个类的全部属性

     1 //获取某个类的全部属性
     2 Field[] field = class1.getDeclaredFields();    //获取当前对象所有成员变量
     3 Field[] field1 = class1.getFields();        //获取所有为public的成员变量(包括父类和子类)
     4 for(int i = 0; i < field.length; i++) {
     5     //获取变量权限
     6     int grade = field[i].getModifiers();        //为private时结果wei2
     7     String priv = Modifier.toString(grade);    
     8     //获取变量属性
     9     Class<?> type = field[i].getType();        //type.getName()结果为变量类型
    10 }

    获取某个类的全部方法

     1 //获取某个类的全部方法
     2 Method method[] = class1.getDeclaredMethods();    //获取当前类中所有的方法
     3 Method method1[] = class1.getMethods();        //获取所有类型为public的方法(包括父类和子类)
     4 for(int i = 0; i<method.length; i++) {
     5     Class<?> returnType = method[i].getReturnType();
     6     Class<?> para[] = method[i].getParameterTypes();    //方法的参数
     7     Class<?> exce[] = method[i].getExceptionTypes();    //所有抛出的异常
     8     int grade = method[i].getModifiers();
     9     String priv = Modifier.toString(grade);
    10 }

    通过反射机制调用某个类的方法

     1 //通过反射机制调用某个类的方法
     2 try {
     3     //使用反射机制调用无参方法
     4     Method method2 = class1.getMethod("reflection1");    
     5     method2.invoke(class1.newInstance());
     6     //使用反射机制调用有参方法
     7     Method method3 = class1.getMethod("reflection2", String.class);    
     8     method3.invoke(class1.newInstance(), "20");
     9 } catch (Exception e) {
    10     System.out.println(e);
    11 }

    通过反射机制获取某个类属性的值

     1 //通过反射机制调用某个类的属性
     2 try {
     3     Test test2 = new Test();
     4     Field field2 = class1.getDeclaredField("name");    
     5     field2.setAccessible(true);            //只能用最近的一次
     6     field2.set(test2, "i an test2");
     7     System.out.println(field2.get(test2).toString());
     8 } catch (Exception e) {
     9     System.out.println(e);
    10 }
  • 相关阅读:
    [Js-JDBC]事务
    [Js-JDBC]SQL注入及解决,Statement与PreparedStatement
    [Js-Java SE]IO+Properties配置文件
    [Js-Java SE]可变长参数
    [Js-Java SE]线程同步(加锁)(synchronized,守护进程,死锁,计时器)
    [Js-MySQL]函数
    [Js-MySQL]运算符优先级
    2015年3月30日
    Maven知识点一览
    记一次MySQL(5.7版本)数据库的主从同步和备份
  • 原文地址:https://www.cnblogs.com/muziqiu/p/12192890.html
Copyright © 2011-2022 走看看