反射操作使用案例分析(一)

反射操作使用案例分析(一)

Java代码和Java文件
Java代码基本格式
	1. Java代码都在类内或者接口内
	2. 
		class 类名 {
			成员变量
			构造方法
			成员方法
			Annotation 注解
		}

Java文件要求:
	1. 通常情况下一个Java文件对应一个Java类
	2. Java文件包含当前Java代码的所有内容!!!
Java文件和.class字节码文件
Java文件
	FirstJava.java
	通过编译器 javac ==> javac FirstJava.java ==> FirstJava.class

.class字节码文件是什么???
	二进制可执行文件。
	.class字节码文件中会包含Java文件的所有内容。
	.class字节码文件包含Java程序的所有可执行内容(注释不参与编译和执行)。
.class字节码文件在内存中的位置

在这里插入图片描述

.class字节码文件和Java代码关系

在这里插入图片描述

Class类相关方法【万恶之源】
Class Class.forName(String packageNameAndClassName) throws ClassNotFoundException;
	根据完整的包名.类名获取对应的Class类对象
	ClassNotFoundException 未找到指定类

Class 类对象.getClass();
	通过类对象获取当前类对象对应的Class类对象
	例如:
		Person p = new Person();  p.getClass() ==> Person类对应Class对象

Class 类名.class;
	通过类名获取当前类对应属性 Class对象
	例如: 
		Person.class ==> Person类对应Class对象。

package com.qfedu.a_reflect;

/**
 * Class类方法演示
 * 
 * @author Anonymous
 *
 */
public class GetClassObject {
	public static void main(String[] args) throws ClassNotFoundException {
		/*
		 * Class Class.forName(String packageNameAndClassName) 
		 * 			throws ClassNotFoundException;
		 */
		Class cls1 = Class.forName("com.qfedu.a_reflect.Person");
		
		/*
		 * Class 类对象.getClass();
		 */
		Person person = new Person();
		Class cls2 = person.getClass();
		
		/*
		 * Class 类名.class;
		 */
		Class cls3 = Person.class;
		
		/*
		 * 		不管是通过哪一种方式获取指定类的Class对象,都是同一个Class对象
		 * 因为当前Person类在当前程序中有且只占用一次代码区空间。
		 */
		System.out.println("cls1 == cls2 : " + (cls1 == cls2));
		System.out.println("cls2 == cls3 : " + (cls2 == cls3));
		System.out.println("cls3 == cls1 : " + (cls3 == cls1));
	}
}
操作Constructor 构造方法类
通过Class类对象获取对应类的Constructor构造方法类对象
Constructor[] getConstructors();
	获取当前Class对象对应类中所有非私有化构造方法类对象数组。
	
Constructor[] getDeclaredConstructors();
	【暴力反射】
	获取当前Class对象对应类中的所有构造方法类对象数组,包括私有化构造方法。
	
Constructor getConstructor(Class... parameterTypes);
	获取当前Class对象中,指定参数数据类型的构造方法。获取的构造方法为非私有化构造方法
	Class... parameterTypes 
		Class类型不定长参数,用于约束当前构造方法对应的数据类型。
	例如:
		无参数构造方法
		cls.getConstructor(); ==> Person();
		两个参数构造方法(int, String)
		cls.getConstructor(int.class, String.class) ==> Person(int, String)
		
Constructor getDeclaredConstructor(Class... parameterTypes);
	【暴力反射】
	获取当前Class对象中,指定数据类型的构造方法,包括私有化构造方法
	例如:
		获取私有化String类型构造方法
		cls.getDeclaredConstructor(String.class) ==> private Person(String.class)

1.6.2 操作Constructor类对象创建对应类对象
Object newInstance(Object... parameters);
	通过Constructor类对象,执行对应的构造方法,创建对应类对象
	Object... 不定长参数,要求数据类型为Object类型。
	例如:
		Person(); 无参数构造方法
		Person p1 = (Person) constructor.newInstance();
		Person(int, java.lang.String);
		Person p2 = (Person) constructor.newInstance(10, "过年啦"); 
package com.qfedu.a_reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 操作Constructor构造方法类对象
 * 
 * @author Anonymous
 *
 */
public class GetConstructorObject {
	public static void main(String[] args) 
			throws ClassNotFoundException, NoSuchMethodException, SecurityException, 
			InstantiationException, IllegalAccessException, IllegalArgumentException, 
			InvocationTargetException {
		/*
		 * Class Class.forName(String packageNameAndClassName) 
		 * 			throws ClassNotFoundException;
		 */
		Class cls = Class.forName("com.qfedu.a_reflect.Person");
		
		/*
		 * 1. 获取当前Class对象对应类中所有非私有化构造方法类对象数组
		 */
		Constructor[] constructors = cls.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}
		
		System.out.println();
		
		/*
		 * 2. 【暴力反射】
		 * 获取当前Class对象对应类中的所有构造方法类对象数组,包括私有化构造方法。
		 */
		Constructor[] declaredConstructors = cls.getDeclaredConstructors();
		for (Constructor constructor : declaredConstructors) {
			System.out.println(constructor);
		}
		
		System.out.println();
		
		/*
		 * 3. 获取当前Class对象中,指定参数数据类型的构造方法。获取的构造方法为非私有化构造方法
		 */
		Constructor constructor1 = cls.getConstructor();
		Constructor constructor2 = cls.getConstructor(int.class);
		Constructor constructor3 = cls.getConstructor(int.class, String.class);
		System.out.println(constructor1);
		System.out.println(constructor2);
		System.out.println(constructor3);
		
		/*
		 * 4. 【暴力反射】	
		 *	获取当前Class对象中,指定数据类型的构造方法,包括私有化构造方法
		 */
		Constructor constructor4 = cls.getDeclaredConstructor(String.class);
		System.out.println(constructor4);
		
		System.out.println();
		/*
		 * newInstance 创建类对象
		 */
		Person p1 = (Person) constructor1.newInstance();
		Person p2 = (Person) constructor2.newInstance(10);
		Person p3 = (Person) constructor3.newInstance(20, "红豆薏米");
		System.out.println(p1);
		System.out.println(p2);
		System.out.println(p3);
		
		/*
		 * 给予暴力反射操作使用权限!!!
		 * setAccessible(boolean flag);
		 */
		constructor4.setAccessible(true);
		Person p4 = (Person) constructor4.newInstance("小米粥");
		System.out.println(p4);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值