java重复代码反射 java 类重复( 五 )


总结:
Java语言反射提供一种动态链接程序组件的多功能方法 。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类 。这些特性使得反射 特别适用于创建以非常普通的方式与对象协作的库 。例如 , 反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用 。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息 , 并允许在运行着的程序中操作这些信息 。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的 。
但反射有两个缺点 。第一个是性能问题 。用于字段和方法接入时反射要远慢于直接代码 。性能问题的程度取决于程序中是如何使用反射的 。如果它作为程序运行中相 对很少涉及的部分,缓慢的性能将不会是一个问题 。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒 。仅反射在性能关键的应用的核心逻辑中使用时性 能问题才变得至关重要 。
许多应用中更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情 。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问 题 。反射代码比相应的直接代码更复杂 , 正如性能比较的代码实例中看到的一样 。解决这些问题的最佳方案是保守地使用反射——仅在它可以真正增加灵活性的地方 ——记录其在目标类中的使用 。
一下是对应各个部分的例子:
具体的应用:
1、 模仿instanceof 运算符号
class A {}
public class instance1 {
public static void main(String args[])
{
try {
Class cls = Class.forName("A");
boolean b1
= cls.isInstance(new Integer(37));
System.out.println(b1);
boolean b2 = cls.isInstance(new A());
System.out.println(b2);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
2、 在类中寻找指定的方法 , 同时获取该方法的参数列表,例外和返回值
import java.lang.reflect.*;
public class method1 {
private int f1(
Object p, int x) throws NullPointerException
{
if (p == null)
throw new NullPointerException();
return x;
}
public static void main(String args[])
{
try {
Class cls = Class.forName("method1");
Method methlist[]
= cls.getDeclaredMethods();
for (int i = 0; imethlist.length;
i++)
Method m = methlist[i];
System.out.println("name
= " + m.getName());
System.out.println("decl class = " +
m.getDeclaringClass());
Class pvec[] = m.getParameterTypes();
for (int j = 0; jpvec.length; j++)
System.out.println("
param #" + j + " " + pvec[j]);
Class evec[] = m.getExceptionTypes();
for (int j = 0; jevec.length; j++)
System.out.println("exc #" + j
+ " " + evec[j]);
System.out.println("return type = " +
m.getReturnType());
System.out.println("-----");
}
}
catch (Throwable e) {
System.err.println(e);
}
}
}
3、 获取类的构造函数信息,基本上与获取方法的方式相同
import java.lang.reflect.*;
public class constructor1 {
public constructor1()
{
}
protected constructor1(int i, double d)
{
}
public static void main(String args[])
{
try {
Class cls = Class.forName("constructor1");
Constructor ctorlist[]
= cls.getDeclaredConstructors();
for (int i = 0; ictorlist.length; i++) {
Constructor ct = ctorlist[i];
System.out.println("name
= " + ct.getName());
System.out.println("decl class = " +

推荐阅读