- 将类的各个组成部分封装为其他对象,这就是反射.
-
好处:
- 可以在程序运行中操作这些对象(idea中的方法提示,就是反射的应用)
- 可以解耦提高程序的课扩展性
-
获取class类对象的方式
- 在源代码阶段:Class.forName(“全类名”):将字节码加载进内存,返回Class对象. 静态方法
- 在类对象阶段:类名.class方式获取
- 在运行阶段: 对象.getClass() 该方法封装在object里,所有对象都有.
- 同一个字节码文件在一次程序运行的过程中,只会被加载一次,无论通过哪一重方式获取的class文件获取的对象都是同一个.
- 方法1 经常用于配置文件中,读取文件,加载类, 方式2将常用于参数的传递,方式3多用于获取对象的字节码
class对象的功能:
1.获取功能 不带Declared的方法只能获取公共的对象,带declared的可以获取所有对象
获取成员变量
获取构造方法
获取成员方法
2.对于成员变量:
1.获取值 get()
2.设置值 set()
3.getField实例
get方法需要传入一个对象参数
Class personClass = Person.class;
Field a = personClass.getField("a");
Person person = new Person();
Object value = a.get(person);
System.out.println(value);
4.在使用getDeclaredField方法获取到变量之后,若要访问私有变量,则要使用暴力反射,即加上setAcessible=true
Class personClass = Person.class;
Field age = personClass.getDeclaredField("age");
age.setAccessible(true);
Object o = age.get(person);
System.out.println(o);
5.获得构造器:1.用来创建对象 newInstance()
2.如果使用空参数构造方法创建对象,可以使用class对象的newInstance方法
6.获取成员方法
参数包括函数名,参数列表两个.
Object.invoke();
获取方法名:getName()
案例
配置文件如下
className=com.sdu.domain.Person
methodName = eat
Person类如下
public class Person {
private String name;
private int age;
public int a ;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", a=" + a +
'}';
}
public void eat(){
System.out.println("eat!!!");
}
public void eat(String food){
System.out.println("eat!!!" + food);
}
}
测试代码如下
public class RefTest {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();//加载配置文件
ClassLoader classLoader = RefTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
//找到当前路径下的文件
pro.load(is);
//获取配置文件中定义的数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
//反射加载该类
Class aClass = Class.forName(className);
Object obj = aClass.newInstance();
Method method = aClass.getMethod(methodName);
method.invoke(obj);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/88907.html