摘、学自:API + http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html
JAVA反射
Java反射是Java被视为动态语言的一个关键性质。它允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(如public, static
..
)、superclass(如Object
..
)、实现的interfaces(如Cloneable
..
),也包括fields和methods的所有信 息,并可于运行时改变fields内容或调用methods。
具体功能
-
获取类的Class
对象
-
获取类的Fields
-
获取类的Method
-
获取类的Constructor
-
新建类的实例
(
Class<T>的函数
newInstance
,
通过Constructor
对象的方法
newInstance
)
-
调用类的函数
(
调用private
函数
)
-
设置/
获取类的属性值
(
private属性
)
-
动态创建代理类
示例
父类:PersonPo
package javas.reflectss;
/**
* 父类
* @author Hust
* @Time 2011-11-3
*/
public class PersonPo {
private String name;
private String pass;
public PersonPo() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
子类UserPo
package javas.reflectss;
/**
* 测试的类
*
* @author Hust
* @Time 2011-11-3
*/
public class UserPo extends PersonPo {
private int id;
float height;
protected double weight;
public boolean active;
public UserPo() {
}
public UserPo(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public void print(){
System.out.println("in UserPo.java print method ");
}
public void print(String s){
System.out.println("in UserPo.java print method String s " + s);
}
public void print(String s,String t){
System.out.println("in UserPo.java print method " + s + t);
}
public void print(String ... s){
System.out.println("in UserPo.java print method String ... s" + s);
}
}
另一测试类UserClass
package javas.reflectss;
/**
* 测试
* @author Hust
* @Time 2011-11-3
*/
public class UserClass {
public int id;
public String class_name;
public int class_code;
public UserClass() {
}
public UserClass(int id,String name,int node) {
this.id = id;
this.class_name = name;
this.class_code = node;
testPrivateM();
}
/**
* private
*/
private void testPrivateM(){
System.out.println("in testPrivateM" + id + class_name+class_code);
}
/**
* proteced
*/
protected void testProtectedM(){
System.out.println("in testProtectedM" + id + class_name+class_code);
}
/**
* public
*/
protected void testPublicM(){
System.out.println("in testPublicM" + id + class_name+class_code);
}
}
反射测试类ReflectionTest
package javas.reflectss;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 反射测试
* @author Hust
* @Time 2011-11-3
*/
public class ReflectionTest {
public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
testFieldMethodConstractor();//取其中变量、方法、构造方法
//callMethod();//调用方法
//setGetFiled();//设置/获取类的属性值
}
/**
* 设置/获取类的属性值
* @throws InstantiationException
* @throws IllegalAccessException
* @throws SecurityException
* @throws NoSuchFieldException
*/
public static void setGetFiled() throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException{
Class<UserClass> userClass = UserClass.class;
UserClass po = userClass.newInstance();
Field intField = userClass.getDeclaredField("id");
intField.set(po, 100);
int getValue = intField.getInt(po);
System.out.println(getValue);
}
/**
* 调用方法
* @throws NoSuchMethodException
* @throws SecurityException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws InvocationTargetException
* @throws IllegalArgumentException
*/
public static void callMethod() throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class<UserPo> userPo = UserPo.class;
UserPo inst = userPo.newInstance();//会调用对象的默认构造器
System.out.println("实例:"+inst);
Method m = userPo.getDeclaredMethod("print", (Class[]) null);
Method m2 = userPo.getMethod("print", String.class); //参数为String
Method m3 = userPo.getMethod("print", String.class,String.class); //参数为String,String
Method m4 = userPo.getDeclaredMethod("print", String[].class);
m.invoke(inst, null); //调用print()方法
m2.invoke(inst, "123"); //调用print(String)方法
m3.invoke(inst, "456","789"); //调用print(String,String)方法
m4.invoke(inst, new Object[]{new String[]{"123","456"}}); //调用print(String[])方法
Class<UserClass> userClass = UserClass.class;
//UserClass po = userClass.newInstance();
Constructor<?> co = userClass.getConstructor(int.class,String.class,int.class);
Object o = co.newInstance(1,"234",5);
Method mc = userClass.getDeclaredMethod("testPublicM");
//mc.setAccessible(true);
mc.invoke(o, null); //调用构造方法(int,String,int)
}
/**
* 取其中变量、方法、构造方法
* @throws NoSuchFieldException
* @throws SecurityException
* @throws NoSuchMethodException
* @throws ClassNotFoundException
*/
public static void testFieldMethodConstractor() throws SecurityException, NoSuchFieldException, NoSuchMethodException, ClassNotFoundException{
//获得基本类型的类信息
//Class<UserPo> userPo = UserPo.class;// 1
//UserPo po = userPo.newInstance();po.setActive(true);
Class<?> userPo = Class.forName("javas.reflectss.UserPo"); // 2
//Class<?> bb = Boolean.TYPE;//boolean 3
System.out.println("====getDeclaredFields = Class对象所表示的类或接口的所有字段=");
Field[] fields = userPo.getDeclaredFields();
for(Field f : fields){
System.out.println(f);
/* 打印结果
private int javas.reflectss.UserPo.id
float javas.reflectss.UserPo.height
protected double javas.reflectss.UserPo.weight
public boolean javas.reflectss.UserPo.active
* */
}
System.out.println("====getDeclaredField = Class对象所表示的类或接口的指定字段=");
Field fieldsd = userPo.getDeclaredField("height");
//取相应的类型
System.out.println(fieldsd.getGenericType());//float
System.out.println(fieldsd.getGenericType().toString().equals("float"));//true
System.out.println("====getFields = Class对象所表示的类或接口所声明的所有可访问公共字段=");
Field[] fieldss = userPo.getFields();
for(Field f : fieldss){
System.out.println(f);//public boolean javas.reflectss.UserPo.active
}
System.out.println("====getMethods = Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member方法=");
Method[] methods = userPo.getMethods();
for(Method m : methods){
System.out.println(m);
/* 所有公共方法
public int javas.reflectss.UserPo.getId()
public void javas.reflectss.UserPo.print(java.lang.String,java.lang.String)
public void javas.reflectss.UserPo.print(java.lang.String)
.....
public java.lang.String javas.reflectss.PersonPo.getName() //父类的方法
public void javas.reflectss.PersonPo.setName(java.lang.String)
public java.lang.String javas.reflectss.PersonPo.getPass()
public void javas.reflectss.PersonPo.setPass(java.lang.String)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
*/
}
System.out.println("====getDeclaredMethods = Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法=");
Method[] methodss = userPo.getDeclaredMethods();
for(Method m : methodss){
System.out.println(m);
/* 仅公共方法
public int javas.reflectss.UserPo.getId()
public void javas.reflectss.UserPo.print(java.lang.String,java.lang.String)
public void javas.reflectss.UserPo.print(java.lang.String)
.....
public void javas.reflectss.UserPo.print(java.lang.String)
*/
}
System.out.println("====getDeclaredMethods=Class对象所表示的类或接口的指定已声明方法");
Method methodsms = userPo.getDeclaredMethod("getHeight", (Class[]) null);
System.out.println(methodsms);//public float javas.reflectss.UserPo.getHeight()
System.out.println("====使用getConstructors获取构造器 ");
Constructor<?>[] constructors = userPo.getConstructors();
for (Constructor<?> m : constructors){
System.out.println(m);
/*
public javas.reflectss.UserPo(int)
public javas.reflectss.UserPo()
**/
}
}
}
打印结果及说明见注释。
分享到:
相关推荐
java反射 java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射
JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用
java反射
java反射,获取所有属性、方法以及List集合类
java反射java反射java反射java反射java反射
Java反射
代码为JAVA反射的一个DEMO,适合初学者临摹学习,还附有properties的创建方法,比较基础。
1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息
Java反射经典实例 Java反射经典实例 Java反射经典实例 Java反射经典实例
这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...
java 反射 调用私有方法(有参数私有方法)获取私有属性值
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
java 反射demo
java反射获取所有属性,获取所有get方法,包括子类父类,以及包括List集合类
java 反射中操作数组 java 反射中操作数组 java 反射中操作数组
Java 反射机制、Java 的类反射机制、Java 反射机制的学习、Java 反射Reflection--运行时生成实例 java反射机制的手册文档
java反射理论及实现
java反射机制原理和反射机制总结!!! java反射机制原理和反射机制总结!!!