package com.reflect;
class Customer
{
private long id;
private String name;
private int age;
public Customer()
{ }
public Customer(String name, int age)
{
this.name = name; this.age = age;
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class testEg
{
/**
* 通过java的反射机制获取类的所有属性和方法 */
@SuppressWarnings("unchecked")
public void test1()
{
try
{
Class c = Class.forName("com.reflect.Customer");
System.out.println("属性:");
Field f[] = c.getDeclaredFields();
for (int i = 0; i < f.length; i++)
{
System.out.println(f[i].getName());
}
System.out.println("方法:");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
{
System.out.println(m[i].toString());
}
}
catch (Throwable e)
{
System.err.println(e);
}
}
/**
* * 通过java的反射机制动态修改对象的属性 *
*
* @param o
*/
@SuppressWarnings("unchecked")
public void test2(Customer o)
{
try
{
Class c = o.getClass();
// getMethod方法第一个参数指定一个需要调用的方法名称,
//第二个参数是需要调用方法的参数类型列表,如无参数则可以指定null,该方法返回一个方法对象
Method sAge = c.getMethod("setAge", new Class[] { int.class });
Method gAge = c.getMethod("getAge",null);
Method sName = c.getMethod("setName", new Class[] { String.class }); // 动态修改Customer对象的age
Object[] args1 = { new Integer(25) };
sAge.invoke(o, args1); // 动态取得Customer对象的age
Integer AGE = (Integer)gAge.invoke(o, null);
// System.out.println("AGE’Value:"+AGE);
Object[] args2 = { new String("李四") };
sName.invoke(o, args2);
}
catch (Throwable e){
System.err.println(e);
}
}
/**
* * 通过java的反射机制做一个简单对象的克隆 *
*
* @param o *
* @return
*/
@SuppressWarnings("unchecked")
public Object test3(Customer o)
{
Object o2 = null;
try
{
Class c = o.getClass(); // 通过默认构造方法创建一个新的对象
o2 = c.getConstructor(new Class[] {}).newInstance(new Object[] {});
Field fields[] = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++)
{
Field field = fields[i];
String fieldName = field.getName();
// System.out.println(fieldName+"SS");
String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 获得和属性对应的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字
String setMethodName = "set" + firstLetter + fieldName.substring(1); // 获得和属性对应的getXXX()方法
Method getMethod = c.getMethod(getMethodName, new Class[] {}); // 获得和属性对应的setXXX()方法
Method setMethod = c.getMethod(setMethodName, new Class[] { field.getType() }); // 调用原对象的getXXX()方法
Object value = getMethod.invoke(o, new Object[] {}); // 调用拷贝对象的setXXX()方法
setMethod.invoke(o2, new Object[] { value });
}
}
catch (Throwable e)
{
System.err.println(e);
}
return o2;
}
public static void main(String[] args) throws Exception
{
testEg t = new testEg();
t.test1();
Customer customer = new Customer();
customer.setAge(20);
customer.setName("张三");
System.out.println("调用前name: " + customer.getName());
System.out.println("调用前age: " + customer.getAge());
t.test2(customer);
System.out.println("调用后name: " + customer.getName());
System.out.println("调用后age: " + customer.getAge());
Customer customer2 = (Customer)t.test3(customer);
System.out.println("克隆对象的name: " + customer2.getName());
System.out.println("克隆对象的age: " + customer2.getAge());
}
}
分享到:
相关推荐
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...通过分析这些例子,你可以更深入地理解Java反射的使用方式及其在实际开发中的应用。
### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...
Java反射是Java编程语言中的一个强大特性,它允许运行时检查类、接口、字段和方法的信息,甚至可以动态地创建对象并调用其方法。在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`、`Constructor`、`...
标题“java反射小例子”暗示这是一个关于如何在实际项目中应用反射的小型示例。通常,这样的示例会展示如何使用反射来实现以下功能: 1. **获取类信息**:通过`Class.forName()`方法,我们可以根据类名动态加载类...
这个“Java反射简单例子”将深入解释如何使用反射API来动态地创建对象,访问类的属性和方法。下面我们将详细探讨相关知识点。 首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于...
### Java反射机制简介 Java反射机制是Java编程语言的一个强大特性,它允许程序在运行时检查自身,并且能够“看”到类的信息(字段、方法等),甚至可以在运行时调用这些方法或修改这些字段的值。这为开发带来了很大...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
总结起来,这个例子展示了如何将Ehcache的强大缓存能力与Java反射机制相结合,以提高测试的灵活性和覆盖率。通过深入研究源代码,你可以更好地理解这两种技术如何协同工作,为Java应用程序带来更高效的性能和更全面...
下面是一个简单的Java反射机制的实现例子: ```java import java.lang.reflect.Field; public class ReflectionExample { private String privateField = "默认值"; public static void main(String[] args) ...
下面我们将深入探讨这个小例子以及Java反射机制的相关知识点。 首先,`Class.forName()`方法在例子中被用来动态加载类。`Class.forName(String className)`接收一个类的全名(包括包名),然后返回对应的`Class`...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在标题“Java反射实例”中,我们聚焦于如何在实际编程中应用这一特性。通过反射,我们可以动态地...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理以及...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够在运行时创建和访问这些类的对象。在Java中,反射提供了对类对象的元数据(metadata)的访问,使得我们可以...
在“Java反射演示Demo”中,可能会包含创建对象的例子。通常,我们使用new关键字来创建对象,但反射允许我们在运行时动态创建对象,即使我们没有类的实例。可以这样实现: ```java Constructor<?> constructor = ...
Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这种能力使得Java代码能够具备高度的动态性,能够在不预先知道具体类的情况下,调用类的方法,访问字段,...
3. 测试框架:反射机制可以用于实现测试框架,测试框架可以使用反射机制来动态地加载和使用类、方法、变量等。 在这个例子中,我们可以看到反射机制的强大之处,它可以使我们的程序更加灵活和可扩展。但是,反射...
总结起来,Java反射是一个强大但需要谨慎使用的特性。它为开发者提供了运行时的灵活性,但也带来了潜在的风险。理解和熟练运用反射,可以极大地提升Java应用程序的动态性和适应性。在实际开发中,要根据需求权衡利弊...