提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
闲来无事,整理一下很久以前学习的笔记,顺便记录下来,留作日后参考~
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是反射
程序在运行时,动态的去获取类的信息、加载类、创建对象、操作类或方法和属性。
- 获取类对象,也就知道这个类的信息(定义什么方法、属性、类名等)
- 可以构造这个类的实例、可以操作这个类对象的某个方法或属性
说人话就是,你不new 对象了,一样有对象,随意玩弄。嘿嘿~
二、反射的使用
废话不多说,最容易理解的就是自己去操作一遍反射的操作~
1.定义一个类
我给了两个构造,一个无参构造、一个有参构造
定义一个类:
public class ReflectionDemo {
public String username;
private Integer password ;
public ReflectionDemo() {
}
public ReflectionDemo(String name) {
System.out.println(name);
}
public void say() {
System.out.println("hello!");
}
public void talk(String name, Integer age) {
System.out.println(name + "今年:" + age + "岁!");
}
}
2.获取类对象的三种方式
//1.通过对象的getClass()方法获取
ReflectionDemo rd = new ReflectionDemo();
Class<? extends ReflectionDemo> aClass = rd.getClass();
System.out.println("通过对象的getClass()方法获取:"+aClass);
//2.通过类名的class
Class<? extends ReflectionDemo> aClass1 = ReflectionDemo.class;
System.out.println("通过类名的class: "+aClass1);
//3.通过Class.forName()
try {
Class<?> aClass2 = Class.forName("com.my.reflection.ReflectionDemo");
System.out.println("Class.forName():"+aClass2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
运行结果:
通过对象的getClass()方法获取:class com.my.reflection.ReflectionDemo
通过类名的class: class com.my.reflection.ReflectionDemo
Class.forName():class com.my.reflection.ReflectionDemo
3.获取属性
/**
* 反射 获取成员变量
* Field getField(String name) 根据变量名,返回一个具体的具有public属性的成员变量
* Field[] getFields() 返回具有public属性的成员变量的数组
* Field getDeclaredField(String name) 根据变量名,返回一个成员变量(不分public和非public属性)
* Field[] getDelcaredFields() 返回所有成员变量组成的数组(不分public和非public属性)
*/
Class class4 = null;
try {
//获取类对象
class4 = Class.forName("com.my.reflection.ReflectionDemo");
//获取属性
Field field1 = class4.getField("username");
System.out.println("field1=" + field1.getName());
Field field2 = class4.getDeclaredField("password");
System.out.println("field2=" + field2.getName());
System.out.println("*******************");
// 使用getFields获取属性
Field[] fields = class4.getFields();
for (Field f : fields) {
System.out.println(f);
}
System.out.println("*******************");
// 使用getDeclaredFields获取属性
fields = class4.getDeclaredFields();
for (Field f : fields) {
System.out.println(f);
}
运行结果:
field1=username
field2=password
*******************
public java.lang.String com.my.reflection.ReflectionDemo.username
*******************
public java.lang.String com.my.reflection.ReflectionDemo.username
private java.lang.Integer com.my.reflection.ReflectionDemo.password
4.获取类的方法
/**
* 反射 调用 对象方法
* Method getMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的具有public属性的方法
* Method[] getMethods() 返回所有具有public属性的方法数组
* Method getDeclaredMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的方法(不分public和非public属性)
* Method[] getDeclaredMethods() 返回该类中的所有的方法数组(不分public和非public属性)
*/
Class class3 = null;
try {
class3 = Class.forName("com.my.reflection.ReflectionDemo");
Method method = class3.getMethod("talk", String.class,Integer.class);
Object object = class3.newInstance();
method.invoke(object, "老王",18);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
运行结果:
运行结果:
老王今年:18岁!
5.获取类的Constructor并创建对象
/**
* 反射通过无惨构造实例对象
*/
Class class1 = null;
try {
class1 = Class.forName("com.my.reflection.ReflectionDemo");
Object object = class1.newInstance();
ReflectionDemo reflectionDemo = (ReflectionDemo) object;
reflectionDemo.say();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
/**
* 反射通过构造实例对象
* Constructor getConstructor(Class[] params)根据构造函数的参数,返回一个具体的具有public属性的构造函数
* Constructor getConstructors() 返回所有具有public属性的构造函数数组
* Constructor getDeclaredConstructor(Class[] params) 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
* Constructor getDeclaredConstructors() 返回该类中所有的构造函数数组(不分public和非public属性)
*/
Class class2 = null;
try {
class2 = Class.forName("com.my.reflection.ReflectionDemo");
Constructor constructor = class2.getConstructor(String.class);
Object object = constructor.newInstance("abc");
ReflectionDemo reflectionDemo = (ReflectionDemo) object;
reflectionDemo.say();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
运行结果:
运行结果
hello!
abc
hello!
总结
本章主要内容:
- 弄明白反射是啥
- 利用反射获取类对象,操作类的方法和属性,以及创建对象。