反射基本学习
反射概述:
Java 反射机制:是指在运行时去获取一个类的变量和方法信息,然后通过获取到的信息来创建对象,调用方法的一种机制。
由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期间仍然可以扩展。
获取Class类的对象:
我们想要通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Class类型的对象,这里我们提供三种方式获取Class类型的对象。
1.使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
2.调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用该方法
3.使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整的包名的路径
反射获取构造方法并使用:
Class 类中用于获取构造方法的方法
Constructor<?>[]getConstructors():返回所有公共构造方法对象的数组
Constructor<?>[]getDeclaredConstructors():返回所有构造方法对象的数组
Constructor<?>[]getConstructor(Class<?>…parameterTypes):返回单个公共构造方法对象
Constructor<?>[]getDeclaredConsructor(Class<?>…parameterTypes):返回单个构造方法对象
Constructor类中用于创建对象的方法:
T newInstance(Object…initargs):根据指定的构造方法创建对象
ReflectDemo.java测试类
public class ReflectDemo {
/*
三种方式获取class对象:
1.使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
2.调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用该方法
3.使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整的包名的路径
*/
public static void main1(String[] args) throws ClassNotFoundException {
//使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象
Class<Student> c1 = Student.class;
System.out.println(c1);
Class<Student> c2 = Student.class;
System.out.println(c2);
System.out.println(c1 == c2);
System.out.println("-------------------");
//调用对象的getClass()方法,返回该对象所属类对应的Class对象,该方法是Object类中的方法,所有的Java对象都可以调用该方法
Student s = new Student();
Class<? extends Student> c3 = s.getClass();
System.out.println(c3);
System.out.println(c1 == c3);
System.out.println("-------------------");
//使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整的包名的路径
Class<?> c4 = Class.forName("Day15.反射.Student");
System.out.println(c1 == c4);
/*
结果:
class Day15.反射.Student
class Day15.反射.Student
true
-------------------
class Day15.反射.Student
true
-------------------
true
*/
}
/*
Class 类中用于获取构造方法的方法
Constructor<?>[]getConstructors():返回所以公共构造方法对象的数组
Constructor<?>[]getDeclaredConstructors():返回所有构造方法对象的数组
Constructor<?>[]getConstructor(Class<?>...parameterTypes):返回单个公共构造方法对象
Constructor<?>[]getDeclaredConsructor(Class<?>...parameterTypes):返回单个构造方法对象
Constructor类中用于创建对象的方法:
T newInstance(Object...initargs):根据指定的构造方法创建对象
*/
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取Class对象
Class<?> c = Class.forName("Day15.反射.Student");
/*
//Constructor<?>[] getConstructors()返回一个包含Constructor对象的数组,Constructor对象反映了由该Class对象表示的类的,所有公共构造函数
Constructor<?>[] cons = c.getConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
*/
//Constructor<?>[] getDeclaredConstructors() 返回反映由该Class对象表示的类的,所有构造函数的Constructor对象数组
Constructor<?>[] cons = c.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
System.out.println("---------------");
//Constructor<?>[] getConstructor(Class<?>...parameterTypes)返回一个Constructor对象,该对象反映由该Class对象表示的类的指定 公共 构造函数
//Constructor<?>[] getDeclaredConstructor(Class<?>...parameterTypes)返回一个Constructor对象,该对象反映由该Class对象表示的类或者接口的指定构造函数
//参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象
Constructor<?> con = c.getConstructor();
//Constructor提供了一个类的单个构造函数的信息和访问权限
//T newInstance(Object...initargs)使用由此Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的实例
Object obj = con.newInstance();
System.out.println(obj);
}
/*
结果://所有得构造方法
public Day15.反射.Student(java.lang.String,int,java.lang.String)
Day15.反射.Student(java.lang.String,int)
private Day15.反射.Student(java.lang.String)
public Day15.反射.Student()
---------------
Student{name='null', age=0, address='null'}
*/
}
ReflectDemo1.java 反射获取构造方法练习
public class ReflectDemo1 {
/*
练习1:
通过反射实现如下操作:
Student s = new Student("林青霞",30,"西安");
System.out.println(s);
基本数据类型也可以通过.class得到对应的class类型
*/
publi