黑马程序员——Java反射

原创 2013年12月04日 21:08:12

 黑马程序员——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. }  

相关文章推荐

黑马程序员——java学习笔记--反射机制

什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。 java的反射机制的实现要借...

黑马程序员:Java学习笔记——反射

黑马程序员:Java学习笔记——反射     ---------------------- android培训、java培训、期待与您交流! ---------------------- ...

黑马程序员——java基础---反射、正则

对java中的正则和反射进行了介绍

黑马程序员——【Java反射学习】动态加载类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Class类的使用方法的反射成员变量的反射构造函数的反射Java类加载机制 Cl...

黑马程序员——java的反射机制

------- android培训、java培训、期待与您交流! ---------- 前言:通过观看毕向东老师的java基础视频,查漏补缺,将一些自己掌握的还不牢固的知识写出来,希望和大家交流分享。...
  • hgdswj
  • hgdswj
  • 2015年07月02日 10:11
  • 375

黑马程序员——Java基础---反射

一、Class对象 1、获取Class对象的三种方式  * 1.Object类中getClass()方法:必须通过对象调用  * 2.任何的数据类型(包括基本数据类型),都有一个静态属性(class属...

黑马程序员——Java高新技术---反射

——— android培训、java培训、期待与您交流! ———理解反射所谓反射,就是把一个类里面所有的变量和方法以及构造器的信息都复制出来,可以查看,还可以使用。所以反射的出现让我们可以动态的实用类...

黑马程序员——java高新(反射)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 第十七章:java高新(反射) 整章反射: 1、反射定义:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员——Java反射
举报原因:
原因补充:

(最多只允许输入30个字)