反射概述
什么是Java的反射机制
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
我们可以看到我们所写的java程序最开始是一个java文件,想要运行首先要便宜成.class文件,我们java运行在java虚拟机JVM,每个编译后的源代码都会在虚拟机上有对应的ClassLoad,这称之为运行。这时JVM可以从class中获得A的属性,然后可以通过A.class动态展示A的实例对象,这称之为反射。
Java的反射机制的作用
- 是用来编写一些通用性较高的代码或者框架的时候使用。
反射的API
1.Class类
- Class类的实例表示正在运行的Java应用程序中的类和接口
- Java中java.lang.Class类用于表示一 个类的字节码(.class)文件
如何得到某个class文件对应的Class对象 - 已知类和对象的情况下
类名.class
对象.getClass() — Object类提供 - 未知类和对象的情况下
Class.forName(“包名.类名”) - Class类代表某个类的字节码,并提供了加载字节码的方法:
– forName(“包名.类名”) , forName方法用于加载类字节码到内存中并封装成一个Class对象
首先创造一个Person的java程序代码
package cn.hdc.demo;
public class Person {
//属性
private String name;
private String Sex;
//get and set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return Sex;
}
public void setSex(String sex) {
Sex = sex;
}
//有参
public Person(String name, String sex) {
this.name = name;
Sex = sex;
}
//无参
public Person() {
super();
}
//eat方法
public void eat(){
System.out.println("吃.....");
}
public void run(){
System.out.println("跑.....");
}
public String sayHello(){
return "hello"+name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", Sex='" + Sex + '\'' +
'}';
}
}
通过三种方法获得Class对象
2.Constructor类
- Constructor类是关于类的单个构造方法的信息以及对应的访问权限
- 得到某个类的所有构造方法
Constructor [] constructors = Class.forName("java.lang.String").getConstructors();
- 得到指定构造方法并调用
Constructor [] constructors = Class.forName("java.lang.String").getConstructors(String.class);
String str = (String)constructors.newInstance("abc");
- Class类的newInstance()方法用来调用磊的默认构造方法
String opj = (String)Class.forName("java.lang.String").newInstance();
编写测试类,测试
3.Field
- Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
- Field对象的获得
-----得到所有的成员变量
●Field[] fields = c.getFields(); //取得所有public属性(包括父类继承)
●Field[] fields = c.getDeclaredFields); //取得所有声明的属性
-----得到指定的成员变量
●Field name = C. getField(" name");
**●Field name = C. getDeclaredField(" name");** 常用
- 设置Field变量是否可以访问
-----field.setAccessible(boolean); - Field变量值的读取设置
-----field.get(opj)
-----field.set(opj,value)
编写测试类,测试
4.Method
- Method提供关于类或接口上单独某个方法的信息。
- Method对象的获得
-----获得所有方法
getDeclaredMethods()
getMethods()
-----获得指定的方法
getDeclaredMethod(String name, Class<?>...parameterTypes)
getMethod(String name, Class<?>...parameterTypes)
●通过反射执行方法:
invoke(Object obj, Object... args)
编写测试类,测试
总结
以上就是今天要讲的内容,本文介绍了:
反射概述
什么是Java的反射机制
Java的反射机制的作用
反射的API
1.Class类
2.Constructor类
3.Field
4.Method