反射的原理:
*应用在一些通用性比较高的代码中
*框架技术大部分都是使用反射来实现的,所以反射很重要
*框架开发中,都是基于配置文件开发,配置文件中配置了类,通过反射得到类中的所有内容,可以让类中的某个方法来执行
*类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法
假设有一个Person.java文件保存在硬盘中
1、编译成.class文件
2、在JVM中把class文件使用类加载器加载进内存中
3、Class类:class字节码文件在内存中的表示
如果得到了Class类,可以得到这个类中的所有内容包括属性、构造方法、普通方法
使用发射的第一步就是得到Class类
得到Class类的三种方式:
1、类名.class
2、对象.getClass();
3、使用Class.forName("目标class的路径");
在Class类中属性、构造方法、普通方法有不同的表示:
1、属性:Field类
2、构造方法:Constructor类
*应用在一些通用性比较高的代码中
*框架技术大部分都是使用反射来实现的,所以反射很重要
*框架开发中,都是基于配置文件开发,配置文件中配置了类,通过反射得到类中的所有内容,可以让类中的某个方法来执行
*类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法
假设有一个Person.java文件保存在硬盘中
1、编译成.class文件
2、在JVM中把class文件使用类加载器加载进内存中
3、Class类:class字节码文件在内存中的表示
如果得到了Class类,可以得到这个类中的所有内容包括属性、构造方法、普通方法
使用发射的第一步就是得到Class类
得到Class类的三种方式:
1、类名.class
2、对象.getClass();
3、使用Class.forName("目标class的路径");
在Class类中属性、构造方法、普通方法有不同的表示:
1、属性:Field类
2、构造方法:Constructor类
3、普通方法:Method类
java代码:
public class Person {
//属性
String name;
int age;
String sex;
//构造方法
public Person() {
}
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//普通方法
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}测试代码:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
public class TestPerson {
private void test() throws Exception {
//获取Class类
Class class1 = Person.class;
Class class2 = new Person().getClass();
Class class3 = Class.forName("reflect.Person");
}
/*
*操作Class中的普通方法
*/
@Test
public void t4() throws Exception{
//获得Class类对象
Class c2 = Class.forName("reflect.Person");
//获得Person实例
Person p1 = (Person)c2.newInstance();
//获得setName方法的对象
//第一个参数是方法名,第二个参数是数据类型的class形式
Method m = c2.getDeclaredMethod("setName", String.class);
//m.setAccessible(true);如果是private方法需要使用该方法赋予操作权限
//通过invoke操作setName方法
//第一个参数是具体要操作的对象,第二个是传入的值
//invoke(null, "wangwu"):代表着使用的是普通方法
m.invoke(p1, "wangwu");
System.out.println(p1.getName());
}
/**
* 操作对象的属性
* 能操作的属性的权限不能是private
*/
/*@Test
public void t3() {
try {
//获得Class类对象
Class c2 = Class.forName("reflect.Person");
Person p1 = (Person)c2.newInstance();
//得到所有属性
//c2.getDeclaredFields();
//得到name的属性,并封装成对象
Field f1 = c2.getDeclaredField("name");
f1.set(p1, "zhangsan");
f1.setAccessible(true);//这个表示能操作private权限的属性
System.out.println(f1.get(p1));//与System.out.println(p1.getName());相同
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
/**
* 操作有参的构造方法
* @throws Exception
*/
/*@Test
public void t2() throws Exception{
//获得Class类对象
Class c1 = Class.forName("reflect.Person");
//得到所有的构造方法
//c1.getConstructors();
//得到有参的构造方法
//参数的传递也一定是类型的.class形式
Constructor cs = c1.getConstructor(String.class,int.class,String.class);
//得到具体的对象
Person p1 = (Person)cs.newInstance("zhangsan",18,"男");
System.out.println(p1.toString());
}*/
/**
* 操作无参的构造方法
* @throws Exception
*/
/*@Test
public void t1() throws Exception{
//获得Class类对象
Class c3 = Class.forName("reflect.Person");
//得到Person实例
Person p1 = (Person)c3.newInstance();
p1.setName("张三");
System.out.println(p1.getName());
}*/
}
1417

被折叠的 条评论
为什么被折叠?



