反射类
package util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import test.web.example.PP;
/**
*
* @author peidw
*
*/
public class Reflection {
/**
* 取得参数对象中的公共属性
* @param obj
* @param fieldname
* @return
* @throws Exception
*/
public Object getProperty(Object obj,String fieldname)throws Exception{
Object result=null;
Class objClass=obj.getClass();
Field field=objClass.getField(fieldname);
result=field.get(obj);
return result;
}
/**
* 获得某类的静态属性
* @param className
* @param fieldName
* @return
* @throws Exception
*/
public Object getStaticProperty(String className,String fieldName)throws Exception{
Class cls=Class.forName(className);
Field field=cls.getField(fieldName);
Object provalue=field.get(cls);
return provalue;
}
/**
* 获取参数对象的属性值
* @param obj
* @param propertyName
* @return
* @throws Exception
*/
public Object getPrivatePropertyValue(Object obj,String propertyName)throws Exception{
Class cls=obj.getClass();
Field field=cls.getDeclaredField(propertyName);
field.setAccessible(true);
Object retvalue=field.get(obj);
return retvalue;
}
/**
* 执行某对象的方法
* @param owner
* @param methodName
* @param args
* @return
* @throws Exception
*/
public Object invokeMethod(Object owner,String methodName,Object[] args)throws Exception{
Class cls=owner.getClass();
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
Method method=cls.getMethod(methodName,argclass);
return method.invoke(owner, args);
}
/**
* 执行静态类的方法
* @param className
* @param methodName
* @param args
* @return
* @throws Exception
*/
public Object invokeStaticMethod(String className,String methodName,Object[] args)throws Exception{
Class cls=Class.forName(className);
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
Method method=cls.getMethod(methodName,argclass);
return method.invoke(null, args);
}
public Object newInstance(String className,Object[] args)throws Exception{
Class clss=Class.forName(className);
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
java.lang.reflect.Constructor cons=clss.getConstructor(argclass);
return cons.newInstance();
}
public static void main(String[] args)throws Exception{
Reflection rl=new Reflection();
PP p=new PP();
rl.getPrivatePropertyValue(p,"aname");
}
}
测试类
package test.web.example;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.Assert.*;
import util.Reflection;
/**
*
* @author peidw
*
*/
public class ReflectionTest {
private PP pp=null;
private Reflection reflection=null;
@Before
public void setUp() throws Exception {
reflection=new Reflection();
pp=new PP();
}
@Test
public void testGetProperty() throws Exception{
System.out.println(pp);
System.out.println(reflection);
System.out.println(reflection.getProperty(pp, "address"));
//assertEquals(reflection.getProperty(pp, "address"), null);
}
@Test
public void testGetStaticProperty()throws Exception{
assertEquals(reflection.getStaticProperty("test.web.example.PP", "count"),"love you");
}
@Test
public void testGetPrivatePropertyValue() throws Exception{
assertEquals(reflection.getPrivatePropertyValue(pp, "aname"),null);
}
@Test
public void testInvokeMethod() throws Exception{
assertEquals(reflection.invokeMethod(pp, "setAddress", new Object[]{"合浦西场镇"}),null);
assertEquals(reflection.getProperty(pp, "address"), "合浦西场镇");
}
@Test
public void testInvokeStaticMethod()throws Exception {
assertEquals(reflection.invokeStaticMethod("test.web.example.PP", "changeCount",new Object[]{"80"}),true);
assertEquals(reflection.getStaticProperty("test.web.example.PP", "count"),"80");
}
@Test
public void testNewInstance() throws Exception{
Object vpp=reflection.newInstance("test.web.example.PP",new Object[]{"peidw","广州"});
org.junit.Assert.assertNotNull(vpp);
//assertEquals(reflection.getPrivatePropertyValue(vpp,"aname"),"peidw");
}
}
分享到:
相关推荐
### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...
本篇文章将深入探讨Java反射机制,并通过自定义框架的测试代码来进一步理解其应用。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时,程序可以获取类、接口、字段和方法的信息,并且能够调用这些方法,...
本文将详细介绍如何使用Java反射技术来获取内部类中的静态成员变量的值。 #### 二、背景知识 在深入探讨之前,我们需要了解几个基本概念: 1. **内部类**:内部类是一种特殊的类,定义在另一个类(外部类)的内部。...
java的泛型和反射机制一直很难理解和应用,这个程序是关于反射和泛型的综合使用,主要实现获取一个类的属性名和方法,并可以获取属性值,存取属性值,属性名和属性值的字符...只是个工具类,没有写测试类,自己测试下啊
总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...
Java反射调用是Java语言提供的一种强大的动态类型机制,它允许程序在运行时检查并使用类的信息,包括类的方法、属性以及构造器等。在Java中,反射是通过`java.lang.reflect`包中的类实现的,如`Class`、`Constructor...
Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...
本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...
`FangseTest`可能是本次Demo中的主要测试类,可能包含了反射机制的各种使用示例,例如动态调用方法、访问私有成员、遍历类的继承结构等。在实际阅读和理解代码时,可以重点关注这些关键点,同时注意代码的组织结构,...
总结,Java反射提供了强大的能力来探索和操作运行时的类结构。它允许我们在不了解具体类型的情况下创建和操作对象,这在编写动态、灵活的代码时非常有用。然而,由于其潜在的安全风险和性能影响,应该谨慎使用。在`...
在Java编程中,反射(Reflection)是一个强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。然而,反射操作通常比直接的Java代码执行慢,因为它涉及到动态类型检查和方法调用。因此,为了提高性能,...
掌握Java反射机制对于开发者来说是非常有价值的,尤其是在开发框架、自动化测试等方面的应用。 #### 十、参考资料 - [Oracle官方文档](https://docs.oracle.com/javase/tutorial/reflect/) - [Effective Java]...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够在不知道具体类名的情况下创建和调用对象的方法。这为程序员提供了高度的灵活性和动态性,使得Java...
在Java反射中,访问类的字段和方法也十分灵活。`getFields()`返回所有public字段,`getField()`获取指定名称的public字段。对于私有或其他访问修饰符的字段,可以使用`getDeclaredFields()`和`getDeclaredField()`。...
Java 1.5引入的反射机制是其动态性的一个重要体现,它允许程序在运行时检查和操作类、接口、对象及其方法。反射为开发者提供了强大的能力,可以在不知道具体类名的情况下实例化对象,调用方法,访问字段,以及处理...
在Java反射中,针对类的不同组成部分(构造函数、字段和方法),`java.lang.Class`类提供了多种反射调用方式来获取信息。以下是几种常用的反射调用: - **获取构造函数**:`Constructor getConstructor(Class[] ...
Java反射广泛应用于框架开发、动态代理、测试工具等领域。例如,在Spring框架中,反射被用来动态创建对象和调用方法;在Hibernate等ORM框架中,反射用于处理数据库记录与Java对象之间的映射关系。 #### 三、反射...