java反射机制 Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。 这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。
反射有两个缺点。第一个是性能问题。当用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的.
如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。
仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。
许多应用更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。
反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射-- 仅在它可以真正增加灵活性的地方记录其在目标类中的使用.
/* *
* @author smart
*/
public class ReflectTest {
public ReflectTest(String value) {
System.out.println("declared value:"+value);
}
public ReflectTest(){ }
public static void main(String[] args) {
ReflectTest.classObject();
ReflectTest.clsssdeclaredObject();
ReflectTest.classMothodObject();
}
/**
* 直接创建对象调用方法 */
private static void classObject(){
try {
//参数值
Object []value=new Object[]{"1","2"};
//参数类型
Class par[]=new Class[]{String.class,String.class};
Class c=Class.forName("zjnx.sibas.ReflectTest");
//创建类对象
Object object=c.newInstance();
//得到方法对象
Method method=object.getClass().getDeclaredMethod("towStringEq", par);
//调用方法
boolean flag=Boolean.parseBoolean(method.invoke(object, value).toString());
System.out.println("flag:"+flag);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 调用有参构造函数,调用方法
*/
private static void clsssdeclaredObject(){
try {
//参数值
Object []value=new Object[]{new String[]{"1","2","3"},new Integer(1)};
//参数类型
Class par[]=new Class[]{String[].class,int.class};
//构造函数参数
Class declared[]=new Class[]{String.class};
//构造函数值
Object declaredValue[]=new Object[]{"1"};
Class c=Class.forName("zjnx.sibas.ReflectTest");
//初始化构造函数
Constructor constructor = c.getDeclaredConstructor(declared);
//新建对象
Object object=constructor.newInstance(declaredValue);
//得到方法对象
Method method=object.getClass().getDeclaredMethod("printValue", par);
//调用方法
method.invoke(object, value);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void classMothodObject(){
try {
//构造函数参数
//参数值
Object []value=new Object[]{new String[]{"1","2","3"},new Integer(1)};
//参数类型
Class par[]=new Class[]{String[].class,int.class};
//构造函数参数
Object declared[]=new Object[]{"1"};
//类完整路径
String className="zjnx.sibas.ReflectTest";
Object object=ReflectTest.getInstance(className, declared);
//Object object=ReflectTest.getInstance(className, null);
//得到方法对象
Method method=object.getClass().getDeclaredMethod("printValue", par);
//调用方法
method.invoke(object, value);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 按照指定的类名称 并按照指定的参数进行构造而获取实例
*
* 限制性条件为: objects 中的className 必须和构造参数中的类型一致。
*
* 如果Object 中存在 超越 参数类型的方法将导致初始化失败!!!! 例如 getInstance("Cr", {new
* Integer(2)}); 将无法应用在构造 方法 Cr(Number num)
* @param className 类名称
* @param objects 构造方法的类名称
* @return 返回构造出的实例
* @throws Exception 初始化错误时返回此项例外
*/
public static final Object getInstance(String className, Object[] objects) {
try {
Class clz = Class.forName(className);
if (objects==null ||objects.length==0)
{
return clz.newInstance() ;
}
Class[] paramClaszz = new Class[objects.length];
for (int i = 0; i < objects.length; i++) {
paramClaszz[i] = objects[i].getClass();
}
Constructor constructor = clz.getDeclaredConstructor(paramClaszz);
return constructor.newInstance(objects);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 是不是某个类的实例
* @param obj 实例
* @param cls 类
* @return 如果 obj 是此类的实例,则返回 true
*/
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}
/**
* 得到某个对象的公共属性
* @param owner, fieldName
* @return 该属性对象
* @throws Exception
*/
public Object getProperty(Object owner, String fieldName) {
try {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 得到某类的静态公共属性
* @param className 类名
* @param fieldName 属性名
* @return 该属性对象
* @throws Exception
*/
public Object getStaticProperty(String className, String fieldName){
try {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private boolean towStringEq(String str1,String str2) {
System.out.println("str1:"+str1+" str2:"+str2);
if (str1.equals(str2)) {
return true;
}else{
return false;
}
}
private void printValue(String []arr,int i) {
System.out.println("i:"+i);
for (int j = 0; j < arr.length; j++) {
System.out.println("arr["+j+"]:"+arr[j]);
}
}
}
分享到:
相关推荐
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
Java 反射机制实例详解是一种动态语言机制,允许在程序运行时加载、探知和使用编译期间完全不知道的类、生成其对象实体,调用其方法或者对属性设值。下面是 Java 反射机制实例详解的知识点: 1. 反射机制的概念 ...
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
通过上述实例,我们可以看到Java反射机制在许多实际场景中的应用,它扩展了Java代码的灵活性和可扩展性。然而,也应注意,过度使用反射可能会引入复杂性和潜在的安全风险,因此在设计和实现时需权衡利弊。在理解了...
### Java反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...
Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用类的方法等。通过反射,程序可以动态地创建对象和调用其方法,从而实现更灵活的功能。 #### 二、Java反射机制的由来与发展 Java反射机制...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...
Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。这种能力使得 Java 应用程序更加灵活,能够在运行时发现和修改自身的行为。然而,反射...
Java反射机制允许我们动态地获取类的信息,并在运行时创建和调用对象的方法。这种能力使得Java具有高度的灵活性和动态性,特别是在处理跨版本兼容性、元数据操作以及插件系统等方面。 二、反射的基本使用 1. 获取...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...
本实例教程分反射对成员变量、构造器、方法操作,详尽而简略得列出反射机制的应用,希望对大家有用。
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
Java反射机制允许程序在运行时获取关于类、接口、字段和方法的信息,并且能够动态地调用方法和修改字段值。这极大地增强了代码的灵活性和可扩展性。 2. **Class类**: 所有的Java类都隐式地继承自java.lang.Class...
在提供的"java反射实例代码"中,应该包含了如何使用上述方法的实际示例,这些示例有助于加深对Java反射机制的理解。通过阅读和运行这些代码,开发者可以更直观地学习如何在程序运行时动态地操作类、方法和字段,从而...