package cn.itcast.demo1;
//学生类
public class Student {
}
package cn.itcast.demo1;
import cn.itcast.demo3.Student;
/*
获取Class对象(字节码文件对象)的三种方式
1. Object类的getClass(方法
Class clazz =对象名.getClass();
2.类的静态属性
Class clazz =类名.class;
3. Class类的静态方法
Class clazz = Class.forName ("类的正名); 正名:包名+类名
注意:
一个源文件(. java文件)对应一个字节码文件对象(. class)
*/
public class ReflectDome2 {
public static void main(String[] args) throws ClassNotFoundException {
//需求:创建Class对象
//方法一
Student stu = new Student();
Class clazz1 = stu.getClass();
//方式二:
Class clazz2 = Student.class;
//方式三:
Class clazz3 = Class.forName("cn.itcast.demo1.Student");
}
}
package cn.itcast.demo2;
public class Student {
//公共的无参构造
public Student() {
}
//公共的带参构造
public Student(String name) {
System.out.println("您录入的name值是" + name);
}
//私有的带参构造
private Student(int age) {
System.out.println("您录入的age值是" + age);
}
}
package cn.itcast.demo2;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/*
Class类
成员方法:
public Constructor getConstructor (Class... params):
根据参数列表,获取对应的构造器对象(仅限公共构造函数)
public Constructor getDeclaredConstructor (Class...params) ;
根据参数列表,获取对应的构造器对象(包含私有构造函数)
public Constructors getConstructors(); 获取此类所有的构造函数(不含私有)
Constructor类: 构造器类
概述:属于java. base模块下的java. lang. reflect包下的类
成员方法:
public String getName(); 获取构造函数名
public T newInstances (Object...params); 根据此构造函数和指定参数创建对象
*/
public class ReflectDemo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//1. 获取字节码文件对象
Class clazz = Class.forName("cn.itcast.demo2.Student");
//2. 获取指定的构造器对象
//2.1 获取公共的无参构造
Constructor con1 = clazz.getConstructor();
System.out.println(con1);
//2.2 获取公共的有参构造
Constructor con2 = clazz.getConstructor(String.class);
System.out.println(con2);
//获取构造器名字,看看是哪个类的构造
System.out.println(con2.getName());
//2.3 获取私有的有参构造
Constructor con3 = clazz.getDeclaredConstructor(int.class);
System.out.println(con3);
//2.4 获取此类所有的构造函数(不含私有)
Constructor[] con4 = clazz.getConstructors();
//增强for循环遍历
for (Constructor con : con4 ) {
System.out.println(con);
}
System.out.println("----------------------------------");
//3. 根据构造器对象的getInstance方法和参数 创建对象
Student stu = (Student) con2.newInstance("张三");
//4. 打印结果
System.out.println(stu);
}
}
package cn.itcast.demo3;
public class Student {
//公共的空参方法
public void show1() {
System.out.println("公共的空参方法");
}
//公共的带参方法
public void show2(int a) {
System.out.println("公共的带参方法,传入的a的值是:" + a);
}
//私有的带参方法
private int show3(int a, int b) {
System.out.println("私有的带参方法");
return a + b;
}
}
package cn.itcast.demo3;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/*
Class类
成员方法:
public Method getMethod(String name, Class- params)
返回一个Method对象,仅公共成员方法
public Method getDeclaredMethod (String, Class.. params)
返回一个Method对象,可获取私有成员方法
public Method[] getMethodsO)返回此类所有 (不含私有)方法的數组
Method:方法类 用来表示所有的成员方法(对象)的.
概述:属于java. base模块下的java. lang. reflect包下的类
成员方法:
public String getName 0); 获取成员方法名
public object invoke (0bject obj; 0bject--. params) 调用指定方法
obj表示该类的对象
params表示调用该方法所需的参数
public void setAccessible (boolean flase): 是否开启暴力反射(true:开启)
*/
public class ReflectProject {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//需求:通过反射获取Student类中的成员方法并调用
//1.创建Student字节码文件对象
Class clazz = Class.forName("cn.itcast.demo3.Student");
//2. 获取该类的构造器对象,然后创建student类的对象
Constructor con = clazz.getConstructor();
Student stu = (Student) con.newInstance();
//System.out.println(stu);
//3. 获取该类的成员方法对象,然后调用此方法
//3.1 调用公共的空参方法
Method method1 = clazz.getMethod("show1");
//打印方法对象
System.out.println(method1);
//打印方法名
System.out.println(method1.getName());
//调用该方法
method1.invoke(stu);
System.out.println("________________________");
//3.2 调用公共的带参方法
Method method2 = clazz.getMethod("show2", int.class);
//打印方法对象
System.out.println(method2);
//打印方法名
System.out.println(method2.getName());
//调用该方法
method2.invoke(stu, 2);
System.out.println("-------------------------");
//3.3 调用私有的带参方法
Method method3 = clazz.getDeclaredMethod("show3", int.class, int.class);
//因为是私有方法,为了可以访问 要加一步srtAccessible为true
method3.setAccessible(true);
//调用方法
int sum = (Integer) method3.invoke(stu, 2, 3);
System.out.println(sum);
//3.4 获取全部的成员方法
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
案例
package cn.itcast.demo4;
public class Student {
public String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
package cn.itcast.demo4;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//需求:通过反射获取类的setter方法,使用该方法为属性赋值
//1. 通过反射获取Student类的字节码文件对象
Class clazz = Class.forName("cn.itcast.demo4.Student");
//2. 通过反射获取该类的构造器对象,然后创建student类的对象
Constructor con = clazz.getConstructor();
Student stu = (Student) con.newInstance();
//3. 获取指定的setName()方法,给Student对象设置值
Method setName = clazz.getMethod("setName", String.class);
setName.invoke(stu,"张三");
//4. 打印学生对象
System.out.println(stu);
}
}
package cn.itcast.demo5;
public class Student {
public String name;
private int age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package cn.itcast.demo5;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/*
Class类
成员方法:
public Field getField(String name) 返回一个Field对象,仅公共成员变量
public Field getField(String name) 返回一个Field对象,可获取私有成员变量
public Field[] getDeclaredFields() 返回此类所有 (含私有)成员变量的数组
Field: 属性类用来表示所有的域(属性,成员变量)对象的.
概述:属于java. base模抉下的java. lang. reflect包下的类
成员方法:
public void setAccessible (boolean flag); 是否开启暴力反射(true:开启)
public void set (0b.ject obj, 0bject value) , 设置obj对象的指定属性值为value
*/
public class ReflectDemo1 {
public static void main(String[] args) throws Exception {
//需求:反射方式获取成员变量并使用
//1. 通过反射获取指定类的字节码文件对象
Class clazz = Class.forName("cn.itcast.demo5.Student");
//2. 通过反射获取构造器对象,创建Student对象
Constructor con = clazz.getConstructor();
Student stu = (Student)con.newInstance();
//Student stu = (Student)clazz.getConstructor().newInstance(); 链式编程
//3. 通过反射获取指定的对象
Field field1 = clazz.getField("name");
Field field2 = clazz.getDeclaredField("age");
field2.setAccessible(true);
field1.set(stu,"张三");
field2.set(stu,20);
//4. 打印结果
System.out.println(stu);
}
}