Java反射——反射机制问题——第一章
Java反射——Class类——第二章
Java反射——类加载——第三章
Java反射——反射获取类的结构信息——第四章
getName:获取全类名
getSimpleName:获取简单类名
getFields:获取所有public修饰的属性,包含本类以及父类的
getDeclaredFields:获取本类中所有属性
getMethods:获取所有public修饰的方法,包含本类以及父类的
getDeclaredMethods:获取本类中所有方法
getConstructors:获取所有public修饰的构造器,包含本类
getDeclaredConstructors:获取本类中所有构造器
getPackage:以Package形式返回包信息
getSuperClass:以Class形式返回父类信息
getInterfaces:以Class[]形式返回接口信息
getAnnotations:以Annotation形式返回注解信息
对如上12个点,进行代码演示
public class ReflectiionUtils {
public static void main(String[] args) {
}
@Test
//第一组方法api
public void api_01() throws Exception {
//获取class对象
Class<?> personcls = Class.forName("com.reflection.Person");
Object o = personcls.newInstance();
// 1. getName:获取全类名
System.out.println("全类名:"+personcls.getName());
// 2. getSimpleName:获取简单类名
System.out.println("简单类名:"+personcls.getSimpleName());
// 3. getFields:获取所有public修饰的属性,包含本类以及父类的
Field[] fields = personcls.getFields();
for (Field fields1:fields){
System.out.println("获取所有public修饰的属性"+fields1.getName());
}
// 4. getDeclaredFields:获取本类中所有属性
Field[] fieldss = personcls.getDeclaredFields();
for (Field fields1:fieldss){
System.out.println("获取本类中所有属性"+fields1.getName());
}
// 5. getMethods:获取所有public修饰的方法,包含本类以及父类的
Method[] methods = personcls.getMethods();
for (Method methods1:methods){
System.out.println("获取所有public修饰的方法,包含本类以及父类的"+methods1.getName());
}
// 6. getDeclaredMethods:获取本类中所有方法
// 7. getConstructors:获取所有public修饰的构造器,包含本类以及父类的
Constructor<?>[] constructors = personcls.getConstructors();
for (Constructor constructor:constructors){
System.out.println("取所有public修饰的构造器,包含本类以及父类的:"+constructor);
}
// 8. getDeclaredConstructors:获取本类中所有构造器
// 9. getPackage:以Package形式返回包信息
System.out.println("以Package形式返回包信息:"+personcls.getPackage());
// 10. getSuperClass:以Class形式返回父类信息
System.out.println("以Class形式返回父类信息:"+personcls.getSuperclass());
// 11. getInterfaces:以Class[]形式返回接口信息
System.out.println("以Class[]形式返回接口信息:"+personcls.getInterfaces());
// 12. getAnnotations:以Annotation形式返回注解信息
}
}
class A{
public String names;
public void m4(){
}
private void m5(){
}
}
interface B{
}
class Person extends A implements B{
//属性
public String name;
protected int age;
String job;
private double sal;
//方法
public void m1(){
}
public void m2(){
}
public void m3(){
}
public Person(){
}
}
[说明:默认修饰符是0,public 是1 , private是2 , protected是4,static是8 , final 是16], public(1) + static (8) = 9
getType:以Class形式返回类型
getName:返回属性名
对如上3个点,进行代码演示
@Test
//第二组方法api java.lang.reflect.Field类
public void api_02() throws Exception {
//获取class对象
//1.以int形式返回修饰符
Class<?> personcls = Class.forName("com.reflection.Person");
Field[] fields = personcls.getDeclaredFields();
for (Field field:fields){
System.out.println("本类中所有属性:"+field.getName()+",以int形式返回修饰符:"+field.getModifiers()+",以Class形式返回类型:"+field.getType());
}
}
class Person {
//属性
public String name;
protected int age;
String job;
private double sal;
}
本类中所有属性:name,以int形式返回修饰符:1,以Class形式返回类型:class java.lang.String
本类中所有属性:age,以int形式返回修饰符:4,以Class形式返回类型:int
本类中所有属性:job,以int形式返回修饰符:0,以Class形式返回类型:class java.lang.String
本类中所有属性:sal,以int形式返回修饰符:2,以Class形式返回类型:double
[说明:默认修饰符是0 , public 是1,private是2 , protected是4,static是8,final 是16]
getReturnType:以Class形式获取返回类型
getName:返回方法名
getParameterTypes:以Class[]返回参数类型数组
对如上4个点,进行代码演示
@Test
//第三组方法api java.lang.reflect.Field类
public void api_03() throws Exception {
//获取class对象
//1.以int形式返回修饰符
Class<?> personcls = Class.forName("com.reflection.Person");
Method[] methods = personcls.getDeclaredMethods();
for (Method method:methods){
System.out.println("本类中所有方法名:"+method.getName()+",以int形式返回修饰符:"+method.getModifiers()+",以Class形式获取返回类型:"+method.getReturnType());
Class<?>[] parameterType = method.getParameterTypes();
for (Class<?> parameterTypes:parameterType ){
System.out.println("以Class[]返回参数类型数组:"+parameterTypes);
}
}
}
class Person {
//方法
public void m1(int m1,float m2){
}
public void m2(){
}
public void m3(){
}
}
本类中所有方法名:m1,以int形式返回修饰符:1,以Class形式获取返回类型:void
以Class[]返回参数类型数组:int
以Class[]返回参数类型数组:float
本类中所有方法名:m2,以int形式返回修饰符:1,以Class形式获取返回类型:void
本类中所有方法名:m3,以int形式返回修饰符:1,以Class形式获取返回类型:void
getModifiers:以in形式返回修饰符
getName:返回构造器名(全类名)
getParameterTypes:以Class[]返回参数类型数组
对如上3个点,进行代码演示
@Test
//第四组方法api java.lang.reflect.Constructor类
public void api_04() throws Exception {
//获取Constructor对象
//1.以int形式返回修饰符
Class<?> personcls = Class.forName("com.reflection.Person");
Constructor[] methods = personcls.getDeclaredConstructors();
for (Constructor method:methods){
System.out.println("本类中所有构造器名:"+method.getName()+",以int形式返回修饰符:"+method.getModifiers());
Class<?>[] parameterType = method.getParameterTypes();
for (Class<?> parameterTypes:parameterType ){
System.out.println("以Class[]返回参数类型数组:"+parameterTypes);
}
}
}
class Person{
//构造器
public Person(int m1,float m2){
}
public Person(double m1,char m2){
}
}
本类中所有构造器名:com.reflection.Person,以int形式返回修饰符:1
以Class[]返回参数类型数组:double
以Class[]返回参数类型数组:char
本类中所有构造器名:com.reflection.Person,以int形式返回修饰符:1
以Class[]返回参数类型数组:int
以Class[]返回参数类型数组:float
通过反射创建对象
方式一: 调用类中的public修饰的无参构造器
方式二:调用类中的指定构造器
Class类相关方法
newlnstance :调用类中的无参构造器,获取对应类的对象
getConstructor(Class…clazz):根据参数列表,获取对应的public构造器对象getDecalaredConstructor(Class…clazz):根据参数列表,获取对应的构造器对象
setAccessible:暴破(暴力破解,使用反射可以访问private构造器/方法/属性,反射面前都是纸老虎)
newlnstance(Object…obj):调用构造器
测试1:通过反射创建某类的对象,要求该类中必须有public的无参构造
测试2:通过调用某个特定构造器的方式,实现创建某类的对象
public class ReflectCreateInstance {
public static void main(String[] args) throws Exception {
//1.调用类中的public修饰的无参构造器
Class<?> cls = Class.forName("com.reflection.Persons");
Object o = cls.newInstance();
System.out.println(o);
//2.通过public的有参构造器创建实例
Constructor<?> constructor = cls.getConstructor(int.class, String.class);
Object zzz = constructor.newInstance(20, "zzz");
System.out.println(zzz);
//3.通过非public的有参构造器创建实例
Constructor<?> constructors = cls.getDeclaredConstructor(int.class);
constructors.setAccessible(true);
Object z = constructors.newInstance(60);
System.out.println(z);
}
}
class Persons{
private int age=10;
private String name="zlj";
public Persons(){
}
public Persons(int age,String name){
this.age=age;
this.name=name;
}
private Persons(int age){
this.age=age;
this.name=name;
}
@Override
public String toString() {
return "Persons{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
Persons{age=10, name='zlj'}
Persons{age=20, name='zzz'}
Persons{age=60, name='zlj'}