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反射的基本使用方法。例子程序是用Android Studio编写的,如果你使用Eclipse,新建一个工程,拷贝src下面的几个类过去就可以了.Android Studio用户...
内容概要:通过带着读者编写Java基础语法测试代码,理解基础数据类型-注解-数组-inet-反射-oop-Java代码实现过程和测试代码 适合人群:初学java语法入门测试代码 能学到什么:①注解、数组、数据类型、inet、method...
本文的例子都可以在示例代码中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request。本文的示例代码主要是基于jOOR行编写的,如果想了解更多请查看这里的测试代码。...
Java类反射应用得非常广泛几乎是所有框架的最核心部分,PHP程序员似乎从不关心反射。尝试着用java的思想去理解php的反射,跟java基本上基本一致。参考了php手册:http://www.php.net/manual/zh/book.reflection.php...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 12.2.4...
10、利用反射获取构造方法的例子--ReflectTest类. 11、动态代理的例子,以及网上动态代理的例子--com.cn21.invocation包。 12、实现可以接受任意接口及其实现类的动态代理--com.cn21.invocation包. 13、实现接口之间...
在java中守护线程和本地线程区别 CMS分为哪几个阶段 抽象的关键字是什么 如何判断对象可以被回收 如何通过反射调用对象的方法 如何进行单元测试 什么情况下会发生栈内存溢出 什么是Hash算法 什么是上下文...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有...
工程介绍:SpringBoot项目脚手架,利用spring aop+java反射实现自定义注解校验参数 源码里有使用都例子在DemoContorller example1:校验userName参数必填 @CheckParams(notNull = true) private String userName;...
例子此实现已通过原始消息进行了测试。 Enigma M3和M4的一些示例配置位于data目录中。 相应的输入可以在测试代码中找到。目标: 模拟... 带有转子I至VIII和反射器A至C的Enigma M3 带希腊转子和薄型反射镜B和C的...
11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值传递 12.2.2 克隆对象 12.2.3 使类具有克隆能力 ...