zoukankan      html  css  js  c++  java
  • java的反射

    
    
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
    
    

      


    1
    package com.www.invoke; 2 3 import java.lang.reflect.Method; 4 5 /** 6 * 通过反射操作 类的方法 7 * java的反射 是说的是运行时 。 8 * 反射的总结: 9 * 1,每个类都有与之对用的Class对象。 10 * 2,每个方法都有与之对用的Method对象。 11 * 3,每个成员变量都有与之对用的Field对象。 12 * 4,第一步都是获得类对应的Class对象。 13 * 5,通过反射可以获得私有的成员变量和方法。 14 * @author Kelly.chen 15 * 16 */ 17 public class InvokeTest { 18 19 public int add(int a, int b){ 20 return a + b; 21 } 22 23 public String getName(String name){ 24 return "My name is "+name; 25 } 26 27 public static void main(String[] args) throws Exception { 28 //获得类对应的的Class对象 方法一 29 //Class<?> classType = InvokeTest.class; 30 //获得类对应的Class对象 方法二 31 Class<?> classType = Class.forName("com.www.invoke.InvokeTest"); 32 //获得InvokeTest 的一个对象 相当于 InvokeTest invokeTest = new InvokeTest(); 33 Object invokeTest = classType.newInstance(); 34 //测试是不是 InvokeTest的对象 结果是 ture 35 System.out.println(invokeTest instanceof InvokeTest); 36 37 //获得 add() 方法 38 //第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数对应 39 Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class}); 40 41 System.out.println(addMethod.getName()); 42 //调用方法 43 //第一个参数是那个对象的方法,第二个参数是Object类型的可变参数,与方法参数对应 44 Object object = addMethod.invoke(invokeTest, new Object[]{2, 3}); 45 46 System.out.println(object); 47 48 //获得getName()方法 49 Method getNameMethod = classType.getMethod("getName", new Class[]{String.class}); 50 //调用getName()方法 51 Object objectName = getNameMethod.invoke(invokeTest, new Object[]{"chenlei"}); 52 System.out.println(objectName); 53 //得到所有public 方法(包括继承父类的方法) 54 Method[] methods = classType.getMethods(); 55 for (Method method : methods) { 56 System.out.println(method.getName());//获得方法的名字 57 } 58 } 59 }

     获得私有方法和成员变量

     1 package com.www.invoke;
     2 
     3 import java.lang.reflect.Field;
     4 import java.lang.reflect.Method;
     5 
     6 public class PrivateTest {
     7     
     8     private String address="shanghai";
     9     
    10     public int age = 20;
    11     
    12     protected String school = "北京大学";
    13     
    14     private String sayHello(String name){
    15         
    16         return "Hello :"+name;
    17     }
    18     public static void main(String[] args) throws Exception {
    19 
    20         Class<?> classType = PrivateTest.class;
    21         PrivateTest privateTest = (PrivateTest) classType.newInstance();
    22         //可以获得私有的方法,第一个参数是方法的名字,第二个参数是Class类型的可变参数,与方法的参数类型对应
    23         Method method = classType.getDeclaredMethod("sayHello", new Class[] { String.class });
    24         //true不再进行访问权限检查,之后就可以访问此私有方法了,false与之相反
    25         method.setAccessible(true); 
    26         //调用方法
    27         Object object = method.invoke(privateTest, new Object[] { "chenlei" });
    28         System.out.println(object);
    29         /* -----------------------------调用 成员变量-----------------------*/
    30         //只能获得public 修饰的方法的成员变量
    31         Field ageField = classType.getField("age"); 
    32         //获得变量的值
    33         int age = ageField.getInt(privateTest);
    34         System.out.println(age);
    35         Field addressField = classType.getDeclaredField("address");
    36         //true不再进行访问权限检查,之后就可以访问此私有变量了
    37         addressField.setAccessible(true);
    38         //获得变量的值
    39         String address = (String) addressField.get(privateTest);
    40         System.out.println(address);
    41         //获得所有public修饰的成员变量
    42         Field[] fields = classType.getFields();
    43         for (Field field : fields) {
    44             System.out.println(field);
    45         }
    46     }
    47 }

    总结:

    java的反射 是说的是运行时 。
    反射的总结:
    1,每个类都有与之对用的Class对象。
    2,每个方法都有与之对用的Method对象。
    3,每个成员变量都有与之对用的Field对象。
    4,第一步都是获得类对应的Class对象。
    5,通过反射可以获得私有的成员变量和方法。
    

      

  • 相关阅读:
    Linux中配置别名
    Linux下的IO监控与分析
    RHEL6 Systemtap 安装笔记
    记一次多事件绑定中自己给自己设置的坑——click,dblclick,mousedown,mousemove,mouseup
    springboot打jar获取不到static静态资源文件问题
    关于springboot默认日志框架Slf4j+logback,自定义Appender问题
    spring 时间格式问题
    springboot 部署到tomcat,获取根路径问题。空格变为%20
    前后端分离 vue+springboot 跨域 session+cookie失效问题
    springboot 部署到tomcat中,项目总是重新部署
  • 原文地址:https://www.cnblogs.com/c9999/p/6068459.html
Copyright © 2011-2022 走看看