package cn.idcast.jdk5;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
/**
* 编写反射API使用
* */
public class ReflfectTest {
public String name;
private String priname;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static void main(String[] args) {
try {
demo4();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void demo5() throws ClassNotFoundException, SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
ReflfectTest reflfectTest = new ReflfectTest();
// 调用reflfectTest对象中setName方法设置name的值
// 1、获得字节码对象
Class c = Class.forName("cn.idcast.jdk5.ReflfectTest");
// String类型参数setName方法
Method setName = c.getDeclaredMethod("setName", String.class); // String类型参数的setName方法
// 调用reflfectTest对象中的setName
setName.invoke(reflfectTest, "this is a test demo"); // 等价于reflfectTest.setName("this is a test demo");
// String类型参数getName方法
Method getName = c.getDeclaredMethod("setName", String.class); // String类型参数的setName方法
// 调用reflfectTest对象中的setName
getName.invoke(reflfectTest, "this is a test demo"); // 等价于reflfectTest.setName("this is a test demo");
}
// 反射可以对内存中任何字节码进行操作
@Test
public static void demo4() throws ClassNotFoundException,
SecurityException, NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
ReflfectTest reflfectTest = new ReflfectTest("Notzuonotdied");
// 使用反射操作类成员变量——Field类
// 1、必须获得目标类,字节码对象
Class c = Class.forName("cn.idcast.jdk5.ReflfectTest");
// 2.操作成员实例变量name
Field[] fields = c.getFields(); // 获得所有的public 成员变量,包括父类继承的
System.out.println("这里变量的数量为1,是因为不包含私有:" + fields.length);
Field[] fields2 = c.getDeclaredFields();// 获取当前类定义的所有成员,包括了private
// 当前Field是private的(名称为"priname"的变量是private),我们是没有操作不了的,因此我们需要设置Field的变量操作权限
Field pnField = c.getDeclaredField("priname");
System.out.println("这里变量的数量为2,是因为公有加私有一共两个:" + fields2.length);
System.out.println(pnField);
// 设置private变量可以访问的
pnField.setAccessible(true);
// 获得reflfectTest对象指定name属性值
Object pnobj = pnField.get(reflfectTest);
System.out.println(pnobj);
// 修改reflfectTest的name的属性值
pnField.set(reflfectTest, "I am Notzuonotdied");
System.out.println(pnField.get(reflfectTest));
/* 输出结果:
*
* 这里变量的数量为1,是因为不包含私有:1
* 这里变量的数量为2,是因为公有加私有一共两个:2
* private java.lang.String cn.idcast.jdk5.ReflfectTest.priname
* Notzuonotdied
* I am Notzuonotdied
*/
}
@Test
public void demo3() throws IllegalArgumentException,
InstantiationException, IllegalAccessException,
InvocationTargetException, SecurityException,
NoSuchMethodException, ClassNotFoundException {
String className = "cn.idcast.jdk5.ReflfectTest";
Class c = Class.forName(className);
Constructor constructors = c.getConstructor();
Constructor constructors1 = c.getConstructor(String.class);
// 调用无参数构造器的写法
ReflfectTest reflfectTest = new ReflfectTest();
// 使用反射实现相同的功能
Object obj = constructors.newInstance();// 调用无参数的构造器,构造对象
Object obj_1 = c.newInstance(); // 通过Class对象newInstance,调用目标类无参数构造器
// 调用无参数构造器的写法
ReflfectTest reflfectTest1 = new ReflfectTest("abcd");
// 使用反射实现相同的功能
Object obj1 = constructors1.newInstance("abcd");// 调用String类型的构造器,构造对象
}
@Test
public void demo2() throws ClassNotFoundException, SecurityException,
NoSuchMethodException, IllegalArgumentException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
// 获得字节码对象
String className = "cn.idcast.jdk5.ReflfectTest";
Class c = Class.forName(className);
// 通过字节码获得一个类构造器
Constructor<String>[] constructors = c.getConstructors();
System.out.println(constructors.length);
// 获得指定构造器
// 带有String参数的构造器
Constructor constructors1 = c.getConstructor(String.class);
}
public ReflfectTest() {
}
public ReflfectTest(String str) {
this.name = str;
this.priname = str;
}
@Test
public void demo1() {
// 获得class对象的三种方式
// 第一种 已知类
Class c1 = Readable.class;
// 第二种 已知对象
Object obj = new ReflfectTest();
Class c2 = obj.getClass();
// 第三种 未知类和对象,知道完整类名
String className = "cn.idcast.jdk5.ReflfectTest";
try {
Class c3 = Class.forName(className);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// --------第三种方式是最常用的方法
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Java笔记——2017年3月3日
共74个文件
class:45个
java:24个
properties:2个
需积分: 9 25 下载量 107 浏览量
2017-03-04
16:33:40
上传
评论
收藏 46KB RAR 举报
温馨提示
Java笔记——2017年3月3日,包含了泛型、枚举、静态导入、自动装箱拆箱、foreach、可变参数、反射等知识
资源推荐
资源详情
资源评论
收起资源包目录
Java笔记——2017年3月3日.rar (74个子文件)
day03
.project 381B
bin
party.properties 155B
cn
idcast
jdk5
GenericTest.class 6KB
Weekdayabs$7.class 664B
EnumAPITest.class 2KB
Color.class 1007B
Weekdayabs$6.class 664B
Weekdayabs$2.class 664B
A.class 892B
Weekdayabs$1.class 664B
Weekdayabs$4.class 664B
EnumConstructorTest.class 2KB
EnumConstructorTest$2.class 581B
B.class 460B
AutoBoxingTest.class 1KB
Weekdayabs.class 2KB
EnumTest.class 279B
ReflfectTest.class 5KB
StaticImportTest.class 834B
Employee.class 808B
WeekDayTest.class 643B
Weekdayabs$5.class 664B
VariableTest.class 2KB
SingletonTest.class 294B
Dota.class 822B
Weekday.class 2KB
Dota$MyIterator.class 1KB
Role4.class 1014B
Role3.class 462B
ForInTest.class 3KB
Weekdayabs$3.class 664B
Role2.class 382B
EnumConstructorTest$1.class 581B
C.class 437B
demo
singer
LiudeHua.class 592B
Xiaohudui.class 594B
Naying.class 586B
Zhangxueyou.class 597B
dancer
Yangliping.class 597B
interfaces
Performable.class 158B
Danceable.class 152B
Singable.class 149B
EveningParty.class 1KB
performer
Zhaobenshan.class 610B
Liuqian.class 594B
Factory.class 2KB
.settings
org.eclipse.jdt.core.prefs 598B
src
party.properties 155B
cn
idcast
jdk5
GenericTest.class 853B
GenericTest.java 5KB
EnumConstructorTest.java 577B
EnumAPITest.java 2KB
WeekDayTest.java 2KB
AutoBoxingTest.java 1KB
ReflfectTest.java 6KB
StaticImportTest.java 644B
SingletonTest.java 709B
VariableTest.java 1KB
Color.java 164B
ForInTest.java 4KB
EnumTest.java 2KB
demo
singer
Zhangxueyou.java 228B
LiudeHua.java 228B
Naying.java 226B
Xiaohudui.java 230B
dancer
Yangliping.java 231B
Factory.java 2KB
interfaces
Danceable.java 128B
Singable.java 126B
Performable.java 133B
EveningParty.java 777B
performer
Liuqian.java 234B
Zhaobenshan.java 241B
.classpath 379B
共 74 条
- 1
资源评论
Notzuonotdied
- 粉丝: 317
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功