JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射的基本步骤:
1. 获得Class对象,就是获取到指定的名称的字节码文件对象。
2. 实例化对象,获得类的属性、方法或构造函数。
3. 访问属性、调用方法、调用构造函数创建对象。
获取class对象的方式的主要有三种 1、根据类名:类名.class 2、根据对象:对象.getClass() 3、根据全限定类名:Class.forName(全限定类名)
通过反射构建对象:
新建User类
package com.wlz;
/**
* @author zhiqiang zhang
* @create 2019-02-11-14:11
**/
public class User {
private String name;
private Integer age;
public User(){
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void sayHello(String name){
System.out.println("Hello "+name);
}
}
/**
* 反射生成对象
* @return
*/
public static User getUser(){
User user=null;
try {
//通过反射生成对象
//构造器不含参
// user=(User)Class.forName("com.wlz.User").newInstance();
//构造器含参
user=(User)Class.forName("com.wlz.User").getConstructor(String.class,Integer.class).newInstance("张三",67);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return user;
}
反射调度方法
/**
* 反射方法
* @return
*/
public static Object reflectMethod(){
Object object=null;
User user=new User();
try {
//仅反射方法,未初始化User,所以打印null
Method method=User.class.getMethod("sayHello", String.class);
try {
object=method.invoke(user,"张三");
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return object;
}
反射生成对象和调度方法
/**
* 反射生成对象和反射调度方法
* @return
*/
public static Object reflect(){
User user=null;
try {
//反射对象
user=(User)Class.forName("com.wlz.User").getConstructor(String.class,Integer.class).newInstance("张三",18);
// //反射方法
Method method=user.getClass().getMethod("sayHello",String.class);
method.invoke(user,"张三");
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return user;
}
测试
System.out.println( ReflectTest.getUser() );
System.out.println(ReflectTest.reflectMethod());
System.out.println(ReflectTest.reflect());
输出:
User{name='张三', age=67}
Hello 张三
null
Hello 张三
User{name='张三', age=18}