您的位置:首页 > 职场人生

黑马程序员——Java反射

2011-12-24 09:04 549 查看
黑马程序员——Java反射
---------------------- android培训java培训、期待与您交流!
----------------------
一、Java语言的反射机制

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

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

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

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

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

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

二、Class 对象的取得途径

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



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

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

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

● 实例:

Constructor<?> con = String.class.getDeclaredConstructor(byte[].class);
System.out.println(con);

String s=(String)con.newInstance("fengyan".getBytes());
System.out.println(s);


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

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

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

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

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

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

● 实例:

public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
}

import java.lang.reflect.Field;

public class ReflectField {
public static void main(String[] args) throws Exception {
ReflectPoint pt = new ReflectPoint(3, 5);
Field fieldX = pt.getClass().getDeclaredField("x");
Field fieldY = pt.getClass().getField("y");
fieldX.setAccessible(true);
System.out.println("x = " + fieldX.get(pt));//访问私有成员
System.out.println("y = " + fieldY.get(pt));
}
}


五、成员方法(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)方法

package com.heima.reflect;
public class InvokeMain {
public static void main(String[] args) {
if (args != null && args.length > 0) {
for (String arg : args)
System.out.println(arg);
} else {
System.out.println("args is null");
}
}
}

import java.lang.reflect.Method;
public class ReflectInvokeMain {
public static void main(String[] args) throws Exception {
String className = "com.heima.reflect.InvokeMain";
Class<?> clazz = Class.forName(className);
Method main = clazz.getMethod("main", String[].class);
main.invoke(null, new Object[] { new String[] { "111", "222", "333" } });
}
}


---------------------- android培训java培训、期待与您交流!
----------------------

详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: