什么叫反射
Java反射机制是在运行状态中
对于任意一个类(class文件),都能知道这个类的所以属性和方法;
对于任何一个对象,都能够调用它的任何一个方法和属性;
这样动态获取新的以及动态调用对象方法的功能就叫做反射
(其实就是用Class这个类对象动态的获取新的以及动态调用对象方法)
Class类对象获取的三种方式
这种反射是通过一个Class类去实现的,获取这个Class类有三种方式
- Object类中的getClass()方法的
- 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
- 用Class类中的静态方法forName
注意:只有第二种方式基本类型才能获取class,第三种最常用,扩展性最好
代码示例
package cn.reflect;
class Student {
private int age;
private String name;
}
public class Test {
/*
* 方式1:
* Object类中的getClass()方法的
* 想要用这种方式,必须要明确具体的类,并创建对象比较麻烦
*/
public static void getClassObject_1(){
Student p = new Student();
Class clazz = p.getClass();
System.out.println(clazz.getName());
}
/*
* 方式二:
* 2,任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
* 相对简单,但是还是要明确用到类中的静态成员。
* 还是不够扩展。
*
*/
public static void getClassObject_2(){
Class clazz = Student.class;
System.out.println(clazz.getName());
}
/*
* 方式三:
* 只要通过给定的类的 字符串名称就可以获取该类,更为扩展。
* 可是用Class类中的静态方法forName完成。
* 这种方式只要有名称即可,更为方便,扩展性更强。注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
*/
public static void getClassObject_3() throws ClassNotFoundException {
String name="cn.reflect.Student";
Class clazz =Class.forName(name);
System.out.println(clazz.getName());
}
public static void main(String[] args) throws ClassNotFoundException {
getClassObject_3();
}
}
Class类对象获取构造函数
package cn.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class Student {
private int age;
private String name;
public Student(String name,int age) {
super();
this.age = age;
this.name = name;
System.out.println("Student param run..."+this.name+":"+this.age);
}
public Student() {
super();
System.out.println("Student run");
}
}
public class Test {
//获取无参构造函数
public static void createNewObject() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
String strName="cn.reflect.Student";
//获取该名称类文件,并加载进内存,并产生Class对象
Class classObj=Class.forName(strName);
//创建对象
Object obj=classObj.getDeclaredConstructor().newInstance();
}
public static void createNewObject_2() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
String strName="cn.reflect.Student";
//获取该名称类文件,并加载进内存,并产生Class对象
Class classObj=Class.forName(strName);
//获取指定的构造函数对象
Constructor constructor=classObj.getConstructor(String.class,int.class);
//通过该构造器对象的newInstance方法进行对象的初始化
constructor.newInstance("xiaoming",20);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
createNewObject_2();
}
}
Class类对象获取成员属性
代码示例
package cn.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
class Student {
private int age;
public String name;
public Student(String name,int age) {
super();
this.age = age;
this.name = name;
System.out.println("Student param run..."+this.name+":"+this.age);
}
public Student() {
super();
age=10;
name="jack";
System.out.println("Student run");
}
}
public class Test {
//获取公有的
public static void getFieldDemo() throws Exception {
Class classObj = Class.forName("cn.reflect.Student");
//只能获取公有的
Field fieldObj=classObj.getField("name");
Object o=classObj.newInstance();
//传入对象获取值
Object o2 = fieldObj.get(o);
System.out.println(o2);
}
//获取私有的进行暴力访问
public static void getFieldDemo_2() throws Exception {
Class classObj = Class.forName("cn.reflect.Student");
//只能获取公有的
Field fieldObj=classObj.getDeclaredField("age");
//对私有字段的访问取消权限检查。暴力访问。
fieldObj.setAccessible(true);
Object o=classObj.newInstance();
Object o2 = fieldObj.get(o);
System.out.println(o2);
}
public static void main(String[] args) throws Exception {
getFieldDemo();
getFieldDemo_2();
}
}
Class类对象获取成员函数
代码示例
package cn.reflect;
import com.sun.jdi.ClassObjectReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class Student {
private int age;
public String name;
public Student(String name,int age) {
super();
this.age = age;
this.name = name;
System.out.println("Student param run..."+this.name+":"+this.age);
}
public Student() {
super();
age=10;
name="jack";
System.out.println("Student run");
}
public void show(){
System.out.println(name+"...show run..."+age);
}
private void privateMethod(){
System.out.println(" method run ");
}
public void paramMethod(String str,int num){
System.out.println("paramMethod run....."+str+":"+num);
}
public static void staticMethod(){
System.out.println(" static method run......");
}
}
public class Test {
//获取所有成员函数
public static void getMethodDemo() throws Exception {
Class classObj=Class.forName("cn.reflect.Student");
//getMethods获取所有的公有的方法
Method[] methodsObj=classObj.getMethods();
//获取本类的所有方法,包括私有
methodsObj=classObj.getDeclaredMethods();
for (Method method:methodsObj){
System.out.println(method);
}
}
//获取无参成员函数
public static void getMethodDemo_2() throws Exception {
Class classObj=Class.forName("cn.reflect.Student");
//根据方法名获取指定的public方法
Method method=classObj.getMethod("show", null);
//通过获取指定的构造函数来创建对象
Constructor conObj=classObj.getConstructor(String.class,int.class);
Object obj=conObj.newInstance("lida",30);
//调用方法
method.invoke(obj, null);
}
//获取有参成员函数
public static void getMethodDemo_3() throws Exception {
Class classObj=Class.forName("cn.reflect.Student");
//根据方法名获取指定的public方法
Method method=classObj.getMethod("paramMethod", String.class,int.class);
Object obj=classObj.newInstance();
//调用方法
method.invoke(obj, "lixiaolong",32);
}
public static void main(String[] args) throws Exception {
//getMethodDemo();
//getMethodDemo_2();
getMethodDemo_3();
}
}