基本概念
什么是反射?
java反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射机制的实现实质:Class
Class类的创建
Class类的实例表示正在运行java应用程序中的类和接口
Class类的对象获取:
1、getClass()
2、.class
3、forName(String className)
类的完全限定名/全名:指src下开始的包的路径
类的简名:没有包名的名称
forName方法 参数必须为类的完全限定名。并且要求类是存在的。否则会报类找不到异常
Class类的实例创建对象
1、newInstance() 创建Class类的对象表示的内个类的对象。返回值是Object类型 需要强制类型转换。
注意: 该方法调用的是无参构造。建议类中如果有有参构造,就必须要提供无参构造
2、 getConstructors() 返回所有的公共的构造方法
3、getConstructor(Class<?>… parameterTypes)返回指定的构造方法,其中 参数表示 构造方法中参数的数据类型的Class类的对象
4、newInstance(Object… initargs) 根据参数值来创建有参构造对应的对象,其中 参数表示实参
5、getDeclaredConstructors() /getDeclaredConstructor(Class<?>… parameterTypes) 返回声明的构造方法,不管是私有 还是public修饰 都可以,只要在类中声明的都算
6、setAccessible(true) 当参数为true ,表示打开访问权限
public class 反射之Class类的创建 {
public static void main(String[] args) throws Exception {
//获取class类的对象
Class clazz = Perss.class;
//创建Perss类的对象
Perss per = (Perss) clazz.newInstance();
//返回公共构造方法
Constructor[] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
//返回所有构造方法(私有和公有)
Constructor[] AllConstructors = clazz.getDeclaredConstructors();//
for (Constructor constructor : AllConstructors) {
System.out.println(constructor);
}
//返回私有有参构造方法
Constructor oneConstructor = clazz.getDeclaredConstructor(String.class);
//反射获取的有参构造方法的使用
//暴力反射,打开访问权限
oneConstructor.setAccessible(true);
Perss p2 = (Perss) oneConstructor.newInstance("李四");
System.out.println(p2);
//获取公共的有参构造
Constructor twoconstructor = clazz.getConstructor(String.class,int.class);
//通过有参构造创建对象
Perss p3 = (Perss) twoconstructor.newInstance("张三",20);
System.out.println(p3);
}
}
class Perss{
String name;
int age;
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Perss() {
super();
// TODO Auto-generated constructor stub
}
public Perss(String name, int age) {
super();
this.name = name;
this.age = age;
}
private Perss(String name) {
super();
this.name = name;
}
public void fun() {
System.out.println("这是Person类中的方法。。。。");
}
}
属性的获取
Filed 字段 属性
常用方法:
① getField(String name) /getFields() 获取公共的字段
② getDeclaredField(String name) /getDeclaredFields() 获取声明的字段 包括private
其中 name表示字段的名称。
③ set(Object obj, Object value) 将obj对象的该字段设置为value值。
④ get(Object obj) 返回obj对象上该字段的值,返回类型为Object
public class 反射之属性的获取 {
public static void main(String[] args) throws Exception {
//获取per类的Class对象
Class clazz = Per.class;
//获取name字段(属性)
Field name = clazz.getDeclaredField("name");
//对于字段(属性)来说,需要属于某个对象,所以要先创建对象
Per p = (Per) clazz.newInstance();
//设置p对象name属性的值
//打开访问权限
name.setAccessible(true);
name.set(p, "张三");
//输出 看效果
System.out.println(p);
//获取p对象name属性中的值
String pName = (String) name.get(p);
System.out.println(pName);
//获取age属性
Field age = clazz.getDeclaredField("age");
//设置p对象的age属性,age属于public,不需要打开访问权限,直接设置
age.set(p, 20);
//输出
System.out.println(p);
//获取p对象age属性的值
int pAge = (int) age.get(p);
//输出
System.out.println(pAge);
//getModifiers() 权限修饰符 返回值 int类型
System.out.println(age.getModifiers());
//getType() 返回字段的声明的数据类型
System.out.println(name.getType());
}
}
class Per{
private String name;
public int age;
@Override
public String toString() {
return "per [name=" + name + ", age=" + age + "]";
}
}
反射的常用方法
1.Method 方法
2.常用方法 :
① getMethod(String name, Class<?>… parameterTypes) /getMethods()
② getDeclaredMethod(String name, Class<?>… parameterTypes) /getDeclaredMethods()
③ invoke(Object obj, Object… args) 方法的调用
其中 obj表示哪个对象的方法,args表示该方法的实参值。该方法的返回值就是需要调用的内个方法的返回值。
如果没有参数,可以使用null表示或者不写。当方法没有返回值时,invoke方法的返回值为nul
public class 反射的方法 {
public static void main(String[] args) throws Exception {
//获取Pers类的class对象
Class clazz = Pers.class;
//创建Pers类的对象
Pers p = (Pers) clazz.newInstance();
//获取Pers类的方法
Method fun = clazz.getMethod("fun", int.class,String.class);
//方法调用
fun.invoke(p, 19,"张三");
Object res = fun.invoke(p, 20,"李四");
System.out.println(res);
//无参方法,参数值为null
Method fun1 = clazz.getMethod("fun1", null);
fun1.invoke(p, null);
//静态方法 调用时,对象可以使用null。
Method sf = clazz.getMethod("sf", null);
sf.invoke(null, null);
sf.invoke(null);
}
}
class Pers{
public String fun(int age,String name) {
System.out.println(age+"===="+name);
return age+":"+name;
}
public void fun1() {
System.out.println("aaaaaa");
}
public static void sf() {
System.out.println("bbbb");
}
}
其它方法
1.getInterfaces() 返回父接口,数组
2.getSuperclass() 返回父类
public class 反射的其它方法 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Class clazz = Zi.class;
//创建对象
Zi z = (Zi) clazz.newInstance();
//返回父类接口、数组
Class[] arr = clazz.getInterfaces();
for (Class class1 : arr) {
System.out.println(class1);
}
Class arr2 = clazz.getSuperclass();
System.out.println(arr2);
}
}
interface X{
public void fun();
}
interface X1 {
public void fun1();
}
class V{
}
class Zi extends V implements X,X1{
@Override
public void fun1() {
// TODO Auto-generated method stub
}
@Override
public void fun() {
// TODO Auto-generated method stub
}
}