反射
类在反射面前是赤裸裸的,被看的一清二楚。
1,简介
2,获取class对象的三种方式
//JavaBean类——Student
//Idea 创建JavaBean快捷键 Alt+insert(构造方法,get和set方法……等)
package com.hanfei.pojo;
public class Student {
private String name;
public Student (){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
package com.hanfei.Reflex;
import com.hanfei.pojo.Student;
public class testreflex {
public static void main(String[] args) throws ClassNotFoundException {
/**
* 获取class对象的三种方式
* 1,Class.forName("全类名");
* 2,类名。class
* 3,对象。getClass();
*/
//第一种方式
//最常用的
Class aClass = Class.forName("com.hanfei.pojo.Student");
//第二种方式
//一般是当做参数传递
Class clazz2 = Student.class;
//第三种
//只有当有类的对象时才能使用
Student s = new Student();
Class clazz3 = s.getClass();
System.out.println(aClass == clazz2);
System.out.println(clazz2==clazz3);
}
}
执行结果:都为true说明获得的都是该类的字节码文件
3,利用反射获取构造方法
代码实现:
//javabean-Student2类
package com.hanfei.pojo;
public class Student2 {
private String name;
private int age;
public Student2(int age) {
this.age = age;
}
public Student2(String name, int age) {
this.name = name;
this.age = age;
}
private Student2(String name){
this.name = name;
}
//测试获取构造方法用例
// protected Student2(String name) {
// this.name = name;
// }
private Student2(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.hanfei.Reflex;
import java.lang.reflect.Constructor;
import java.util.Iterator;
public class testtwo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//获取Class对象
Class<?> st1 = Class.forName("com.hanfei.pojo.Student2");
//获取所有公共构造方法对象的数组
System.out.println("===========");
Constructor<?>[] constructors = st1.getConstructors();
for(Constructor con:constructors){
System.out.println(con);
}
System.out.println("===========");
//获取所有构造方法对象的数组
Constructor<?>[] constructors2 = st1.getDeclaredConstructors();
for(Constructor con:constructors2){
System.out.println(con);
}
System.out.println("===========");
//获取单个公共构造方法对象
Constructor constructors3 = st1.getConstructor(String.class,int.class);
System.out.println(constructors3);
System.out.println("===========");
//获取单个构造方法对象
Constructor constructors4 = st1.getDeclaredConstructor(String.class);
System.out.println(constructors4);
}
}
执行结果:
代码实现:
package com.hanfei.Reflex;
import com.hanfei.pojo.Student2;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class testtwo_1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> st1 = Class.forName("com.hanfei.pojo.Student2");
Constructor constructors4 = st1.getDeclaredConstructor(String.class);
//获取访问修饰符
int mod = constructors4.getModifiers();
System.out.println(mod);
//结果为2
//创建对象
constructors4.setAccessible(true);//忽略权限限制,不设置private修饰的构造方法无法创建对象,但满足权限限制的构造方法可以用
Student2 st2 = (Student2)constructors4.newInstance("张三");
System.out.println(st2);
//获取形参和名字大家可以去看jdk
}
}
执行结果:
4,利用反射获取成员变量(字段值)
代码实现:
ckage com.hanfei.Reflex;
import com.hanfei.pojo.Student2;
import java.lang.reflect.Field;
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class<?> aClass = Class.forName("com.hanfei.pojo.Student2");
//获取所有的公共成员变量,Student2没有公共类
Field[] fields = aClass.getFields();
for(Field fi:fields){
System.out.println(fi);
}
//获取所有的成员变量
Field[] declaredFields = aClass.getDeclaredFields();
for(Field fi :declaredFields){
System.out.println(fi);
}
//获得单个成员变量
Field declaredField = aClass.getDeclaredField("name");
System.out.println(declaredField);
//获取修饰符
declaredField.getModifiers();
//获取名字
System.out.println(declaredField.getName());
//赋值
Student2 st = new Student2("han",19);
declaredField.setAccessible(true);
declaredField.set(st,"hhhh");
System.out.println(st.getName());
}
}
5,利用反射获取成员方法