• Java-反射机制


    定义

    JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
    换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
    ————百度百科

    加载方式

    Class对象有三种获取方法:
    1. XXX.class
    2. Object.getClass()
    3. Class.forName()

    详细使用方法见实例,注释得很详细哟~

    实例

      1 import java.lang.reflect.Constructor;
      2 import java.lang.reflect.Field;
      3 import java.lang.reflect.Method;
      4 
      5 class User{
      6     private int id;
      7     private String name;
      8     
      9     //无参
     10     public User(){
     11         this.id=-1;
     12         this.name="null";
     13     }
     14     
     15     //有参
     16     public User(int id,String name) {
     17         this.id=id;
     18         this.name=name;
     19     }
     20     public int getId() {
     21         return id;
     22     }
     23     public void setId(int id) {
     24         this.id = id;
     25     }
     26     public String getName() {
     27         return name;
     28     }
     29     public void setName(String name) {
     30         this.name = name;
     31     }
     32     @Override
     33     public String toString() {
     34         return "[id=" + id + ", name=" + name + "]";
     35     }
     36     public void hello() {
     37         System.out.println("hello world");
     38     }
     39     private void sing(String song) {
     40         System.out.println("sing "+song+"...");
     41     }
     42 }
     43 
     44 public class Test {
     45 
     46     public static void main(String[] args) throws Exception {
     47         // TODO Auto-generated method stub
     48         User user=new User(0, "les");  //创建测试类
     49         //Class对象有三种获取方法
     50         //===1===
     51         Class class1=User.class;
     52         //===2===
     53         Class class2=user.getClass();
     54         //===3===
     55         Class class3=Class.forName("testForReflection.User");   //包名+类名
     56         //反射机制的功能
     57         //===1===创建实例对象
     58         //无参
     59         User user2=(User) class3.newInstance();
     60         System.out.println("user2"+user2);
     61         //有参
     62         Constructor constructor=class3.getConstructor(int.class,String.class);   //获取有参构造函数
     63         User user3=(User) constructor.newInstance(1,"cc");   //通过构造函数创建实例
     64         System.out.println("user3"+user3);
     65         //===2===获取全部构造函数
     66         Constructor[] constructors=class3.getConstructors();
     67         System.out.println("User构造函数的个数:"+constructors.length);
     68         for(int i=0;i<constructors.length;i++) {
     69             System.out.print(" NO"+i+":");
     70             Class[] parameterTypes=constructors[i].getParameterTypes();
     71             if(parameterTypes.length==0) {
     72                 System.out.print("无参 ");
     73             }else {
     74                 for(int j=0;j<parameterTypes.length;j++) {
     75                     System.out.print(parameterTypes[j].getName()+" ");
     76                 }
     77             }
     78         }
     79         System.out.println("");
     80         //===3===获取成员变量
     81         Field field=class2.getDeclaredField("id");
     82         field.setAccessible(true);   //id为private,将其设为可见
     83         System.out.println("id修改前:"+field.getInt(user));
     84         field.setInt(user, 1);
     85         System.out.println("id修改后:"+field.getInt(user));
     86         //===4===获取全部成员变量
     87         Field[] fields=class2.getDeclaredFields();
     88         System.out.println("User参数个数:"+fields.length);
     89         for(int i=0;i<fields.length;i++) {
     90             fields[i].setAccessible(true);
     91             System.out.println(fields[i].getName()+":"+fields[i].get(user));
     92         }
     93         //===5===获取方法
     94         Method method=class1.getMethod("hello");
     95         method.invoke(user);
     96         Method method2=class1.getDeclaredMethod("sing", String.class);
     97         method2.setAccessible(true);  //打开私有方法权限
     98         method2.invoke(user, "倩女幽魂");
     99         //===6===获取所有方法
    100         Method[] methods=class1.getDeclaredMethods();
    101         //===7===获取所有接口
    102         Class[] interfaces=class1.getInterfaces();
    103         
    104     }
    105 
    106 }
    View Code

    参考链接

  • 相关阅读:
    Confluence 6 连接到一个 LDAP 目录
    Confluence 6 LDAP 成员结构设置
    Confluence 6 LDAP 用户组结构设置
    Confluence 6 LDAP 用户结构设置
    Confluence 6 LDAP 高级设置
    Confluence 6 自动添加用户到用户组
    Confluence 6 权限设置
    一个小白的测试环境docker化之路
    客户端SDK测试思路
    限时购校验小工具&dubbo异步调用实现限
  • 原文地址:https://www.cnblogs.com/StrayLesley/p/10819176.html
Copyright © 2020-2023  润新知