反射原理及使用
2016-03-30 11:32
281 查看
反射原理:
>保存java文件到本地硬盘.java
>.java文件编译变成.class文件
>使用类加载器(jvm)将.class文件加载到内存中,用Class表示
>通过反射,得到Class类,就得到了类中的所有内容(属性、构造方法、普通方法)
属性用Field类表示,构造方法有Constructor方法表示,普通方法用Method类表示
使用反射得到Class类的三种方式:
>类名.class
>对象.getClass()
>Class.forName("路径");
第三种最常用
package demo;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
public static void show(){
System.out.println("Person.");
}
}
eg.获取一个类的实例化,不使用new,怎么得到?
public void fun1() throws Exception{
Class c1=Class.forName("demo.Person");
Person p1=(Person)c1.newInstance(); //调用无参构造方法
p1.setName("lisi");
System.out.println(p1.getName());
}
通过反射操作有参构造方法
public void fun2() throws Exception{
Class c2=Class.forName("demo.Person");
Constructor cs=c2.getConstructor(String.class,int.class);
Person p2=(Person)cs.newInstance("xiaoming",18);
System.out.println(p2.getName()+" "+p2.getAge());
}
通过反射操作属性
public void fun3() {
try {
Class c3 = Class.forName("demo.Person");
Person p3=(Person)c3.newInstance();
Field f1=c3.getDeclaredField("name");
//如果操作的是私有属性,要进行以下设置
f1.setAccessible(true);
f1.set(p3, "lisi");
System.out.println(f1.get(p3));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过反射操作普通方法
public void fun4() throws Exception{
Class c4 = Class.forName("demo.Person");
Person p4=(Person)c4.newInstance();
//第一个参数是方法名,第二个参数是方法中参数类型
Method m=c4.getDeclaredMethod("setName", String.class);
m.invoke(p4, "wangwu");
System.out.println(p4.getName());
}
反射操作静态方法时,invoke的第一个参数是null
>保存java文件到本地硬盘.java
>.java文件编译变成.class文件
>使用类加载器(jvm)将.class文件加载到内存中,用Class表示
>通过反射,得到Class类,就得到了类中的所有内容(属性、构造方法、普通方法)
属性用Field类表示,构造方法有Constructor方法表示,普通方法用Method类表示
使用反射得到Class类的三种方式:
>类名.class
>对象.getClass()
>Class.forName("路径");
第三种最常用
package demo;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
public static void show(){
System.out.println("Person.");
}
}
eg.获取一个类的实例化,不使用new,怎么得到?
public void fun1() throws Exception{
Class c1=Class.forName("demo.Person");
Person p1=(Person)c1.newInstance(); //调用无参构造方法
p1.setName("lisi");
System.out.println(p1.getName());
}
通过反射操作有参构造方法
public void fun2() throws Exception{
Class c2=Class.forName("demo.Person");
Constructor cs=c2.getConstructor(String.class,int.class);
Person p2=(Person)cs.newInstance("xiaoming",18);
System.out.println(p2.getName()+" "+p2.getAge());
}
通过反射操作属性
public void fun3() {
try {
Class c3 = Class.forName("demo.Person");
Person p3=(Person)c3.newInstance();
Field f1=c3.getDeclaredField("name");
//如果操作的是私有属性,要进行以下设置
f1.setAccessible(true);
f1.set(p3, "lisi");
System.out.println(f1.get(p3));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过反射操作普通方法
public void fun4() throws Exception{
Class c4 = Class.forName("demo.Person");
Person p4=(Person)c4.newInstance();
//第一个参数是方法名,第二个参数是方法中参数类型
Method m=c4.getDeclaredMethod("setName", String.class);
m.invoke(p4, "wangwu");
System.out.println(p4.getName());
}
反射操作静态方法时,invoke的第一个参数是null
相关文章推荐
- SVN 集中式版本控制软件
- IOS开发Swift键盘收起,键盘挡住输入模框的处理
- 通过配置文件对“安卓热敏打印的PDA手持终端”的按键分配功能
- iOS沙盒目录解析
- karaf jvm参数配置
- windows常用的命令
- Linux下php安装curl扩展
- jsp页面使用C标签对时间日期进行判断
- socket通信简介
- NSDate 时差8小时解决方法
- SQLite BEGIN TRANSACTION创建提交事务 http://www.uedsc.com/sqlite-begin-transaction.html
- 准备些元件
- eclipse(优化10) eclipse中vm文件样式修改
- Android隐藏状态栏 全屏
- 第三篇:R语言数据可视化之条形图
- react開發環境搭建
- OSI七层与TCP/IP五层网络架构详解
- 在图片上传时候遇到的问题
- Yii的CSRF验证
- VFL-自动布局