关闭

黑马程序员——Java反射

标签: 黑马程序员java语言
331人阅读 评论(0) 收藏 举报
分类:

 黑马程序员——Java反射

一、Java语言的反射机制

在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

Java 反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法。

二、Class 对象的取得途径

Java允许我们从多种途径为一个class生成对应的Classobject


三、构造方法(Constructor)的反射

Class.getConstructors():获得类的public类型的构造方法。

Class.getConstructor(Class[]parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。

  实例:

  1. Constructor<?> con = String.class.getDeclaredConstructor(byte[].class);  
  2. System.out.println(con);  
  3.    
  4. String s=(String)con.newInstance("fengyan".getBytes());  
  5. System.out.println(s);

四、成员变量(Field)的反射

Field类代表类的成员变量(成员变量也称为类的属性)。

Class.getField(String name):根据指定成员名获得类的public类型的属性。

Class.getDeclaredField(String name):根据指定成员名获得类的属性(包括private属性)。

Field.setAccessible(boolean flag):用指定的标记设置属性的访问权限。

Field.get(Object obj):返回这个字段在指定对象上的值。

● 实例:

  1. public class ReflectPoint {  
  2.     private int x;  
  3.     public int y;  
  4.     public ReflectPoint(int x, int y) {  
  5.         this.x = x;  
  6.         this.y = y;  
  7.     }  
  8. }  
  9.    
  10. import java.lang.reflect.Field;  
  11.    
  12. public class ReflectField {  
  13.     public static void main(String[] args) throws Exception {  
  14.         ReflectPoint pt = new ReflectPoint(35);  
  15.         Field fieldX = pt.getClass().getDeclaredField("x");  
  16.         Field fieldY = pt.getClass().getField("y");  
  17.         fieldX.setAccessible(true);  
  18.         System.out.println("x = " + fieldX.get(pt));//访问私有成员  
  19.         System.out.println("y = " + fieldY.get(pt));  
  20.     }  
  21. }  

五、成员方法(Method)的反射

Method类代表类的一个成员方法。

得到类的某一人方法:

         MethodcharAt=String.class.getMethod(“charAt”, int.class);

调用方法:

         通常方式:System.out.println(“fengyan”.charAt(1));

         反射方式:System.out.println(charAt.invoke(“fengyan”,1));

如果Method为静态方法,则调用invoke(Object obj, Object… args)方法的第一个参数传null。

● 实例:通过反射调用main(String[] args)方法

  1. package com.heima.reflect;  
  2. public class InvokeMain {  
  3.     public static void main(String[] args) {  
  4.         if (args != null && args.length > 0) {  
  5.             for (String arg : args)  
  6.                 System.out.println(arg);  
  7.         } else {  
  8.             System.out.println("args is null");  
  9.         }  
  10.     }  
  11. }  
  12.    
  13. import java.lang.reflect.Method;  
  14. public class ReflectInvokeMain {  
  15.     public static void main(String[] args) throws Exception {  
  16.         String className = "com.heima.reflect.InvokeMain";  
  17.         Class<?> clazz = Class.forName(className);  
  18.         Method main = clazz.getMethod("main", String[].class);       
  19.         main.invoke(nullnew Object[] { new String[] { "111""222""333" } });  
  20.     }  
  21. }  
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4646次
    • 积分:160
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档