Reflection 是 Java 程序开发语言的特征之一,它能突破本身的访问控制,允许运行中的 Java 程序进行“自审”,获得类的定义构造信息,并能直接操作程序的内部属性甚至改变初始值等等。而且这些特性是在其他的语言里面所没有的。
ok,首先还是先看一个最简单的例子。
列出 java.lang.Object 这个类的所有方法import java.lang.reflect.*;
public class Demo {
public static void main(String args[]) {
try {
Class c = Class.forName("java.lang.Object");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println("Mothod "+i+" is :"+m[i].toString());
} catch (Throwable e) {
......
}
}
}
输出结果为:Mothod 0 is :public native int java.lang.Object.hashCode()
Mothod 1 is :public final native java.lang.Class java.lang.Object.getClass()
Mothod 2 is :protected void java.lang.Object.finalize() throws java.lang.Throwable
Mothod 3 is :protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException
Mothod 4 is :public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
Mothod 5 is :public final void java.lang.Object.wait() throws java.lang.InterruptedException
Mothod 6 is :public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
Mothod 7 is :public boolean java.lang.Object.equals(java.lang.Object)
Mothod 8 is :public final native void java.lang.Object.notify()
Mothod 9 is :public final native void java.lang.Object.notifyAll()
Mothod 10 is :private static native void java.lang.Object.registerNatives()
Mothod 11 is :public java.lang.String java.lang.Object.toString()
常用的属性:
1、Field:字段信息,可以在程序运行的时候,用过setDouble,setInt等方法赋值。
2、Constructor:构造方法
3、Method:普通方法
常用的方法:
1、Class.forName("java.lang.Object");这个方法是获得java.lang.Object这个类的一个对象,我们可以把它赋值給Class,因为Class是所有类的超类。得到一个类的对象,我们还可以用ClassName.TYPE或者是ClassName.class。
2、ClassName.getDeclaredMethods() :获得ClassName类所有的定义方法。返回一个Method的数组。
3、ClassName.getDeclaredConstructors():获得ClassName类的构造器方法。返回一个Constructor的数组。
4、ClassName.getDeclaredFields():获得ClassName类的所有定义的字段。返回一个Field的数组。
5、Field.getModifiers():获得用来描述字段成员的访问控制符,如:private,public 等等。
6、Method.invoke(methobj, arglist):它的作用是通过Reflection 执行某个方法,返回Object对象。methobj是方法所在的类的一个实例,arglist是调用方法Method的参数列表。
下面是一个综合的例子:import java.lang.reflect.*;
public class Demo {
public static int field1=100;
protected final double field2=200.00;
public static void main(String args[]) {
try {
Class c = Class.forName("Test");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println("Mothod "+i+" is :"+m[i].toString());
Constructor clist[] = c.getDeclaredConstructors();
for (int i = 0; i <clist.length; i++)
System.out.println("class Test's Constructor "+i+" is :"+clist[i].toString());
Field fieldlist[] = c.getDeclaredFields();
for (int i = 0; i <fieldlist.length; i++)
System.out.println("class Test's Field "+i+" is :"+fieldlist[i].toString()+" Type is :"+fieldlist[i].getType()+" Modifier is :"+Modifier.toString(fieldlist[i].getModifiers()));
//调用方法
Class param[] = new Class[2];
param[0] = Integer.TYPE;
param[1] = Integer.TYPE;
Method meth = c.getMethod("getString", param);
Test test = new Test();
Object arglist[] = new Object[2];
arglist[0] = new Integer(100);
arglist[1] = new Integer(200);
Object returnObj = meth.invoke(test, arglist);
System.out.println("Execute method getString() in Test returns:"+returnObj.toString());
} catch (Throwable e) {
System.out.println(e.toString());
}
}
}
class Test{
public int aaa=100;
private String bbb="<a href="http://www.icnote.com" target="_blank" title="http://www.icnote.com" class="mykeyword">博爱老头</a>";
public Test(){}
public Test(int a){}
public void doPrint(){
System.out.println("String printed int method doPrint(). ");
}
public String getString(int a ,int b){
return String.valueOf(a+b);
}
public void method1(){}
public void method(){}
public void method3(){}
}
输出结果是:Mothod 0 is :public java.lang.String Test.getString(int,int)
Mothod 1 is :public void Test.doPrint()
Mothod 2 is :public void Test.method1()
Mothod 3 is :public void Test.method()
Mothod 4 is :public void Test.method3()
class Test's Constructor 0 is :public Test(int)
class Test's Constructor 1 is :public Test()
class Test's Field 0 is :public int Test.aaa Type is :int Modifier is :public
class Test's Field 1 is :private java.lang.String Test.bbb Type is :class java.lang.String Modifier is :private
Execute method getString() in Test returns:300
虽然在通常的开发中,不是很常用到Reflection,但是对于特殊的需求,来采用它的话,会得到意想不到的收获!
分享到:
相关推荐
Qt 使用QMetaObject实现反射机制代码demo
Java中的反射机制Java中的反射机制Java中的反射机制
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
java反射机制和动态代理的原理,熟悉反射机制和动态代理
描述JAVA反射机制应用、举例。描述反射机制的具体实现及方法实现。
给同事写的反射机制的用法,非常简单易用,大家一看就懂。也便于初学者对反射机制的理解 资源免费提供大家下载,如有疑问,可以直接咨询我
有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic ...是可以通过反射机制来实现“动态”,用一个实例来说明一下:
Java 反射机制 代码的实例 请认真阅读 运行此代码 只要读懂了 反射机制也就明白了
Java反射机制的实现_Reflection,适合学习了解反射机制。
Java反射机制Java反射机制Java反射机制Java反射机制
java反射机制原理
这是我自己地java反射机制的总结,在学习饿过程中自己的看法,以及学习的记录,希望能够帮助到大家!
用反射机制改进的抽象工厂
.NET中的反射机制,讲解反射机制的7大关键问题
JAVA的反射机制 JDBC连接各种数据库的方法
对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握
一个例子8个demo让你了解Java反射机制
java的反射机制的应用实例,对反射的机制很好的理解!
类的反射机制 自己遇到的一个知识点 通过代理创建出一个类 执行类的方法