关于Class类类型、反射机制及涉及ClassLoader的基础理解

版权声明:代码无界限,共同学习 https://blog.csdn.net/p414897821/article/details/88086669

最近在疯狂补习张波老师的java基础,感觉整体讲的很透彻,但可能是本人基础较差,所以一些细节在此罗列出来与大家分享借鉴,同时也作为一份学习笔记记录。

package com.lyx;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class text {
	//反射Class类可以动态化构架代码,实现动态化创建实例并可于运行时改变fields(内容)或调用methods(方法)
	
	/*类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。
	 * 通过此实例的 newInstance()方法就可以创建出该类的一个对象。
	 * 实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。
	 */

	public static void main(String[] args) throws NoSuchFieldException, 
SecurityException, NoSuchMethodException, InstantiationException, 
IllegalAccessException, IllegalArgumentException,
InvocationTargetException,ClassNotFoundException {
		// TODO Auto-generated method stub
		c1 a = new c1();
		Class<c1> class1 = (Class<c1>) a.getClass();//通过实例名得到c1的Class类类型
		System.out.print(class1+"\n");
		String strName = a.getClass().getName();//得到c1的类名
		System.out.print(strName+"\n");
		
		Class<c1> class2 = (Class<c1>) a.getClass().getInterfaces()[0];//得到c1的接口
		System.out.print(class2+"\n");
		
		System.out.print(class2.getModifiers()+"\n");//得到c1修饰符(int)
		System.out.print(Modifier.toString(class2.getModifiers())+"\n");//得到c1修饰符(string)
		
		Field field1[] = class1.getFields();//得到c1所有公开字段
		System.out.print(field1[0].toString()+"\n"+field1[1].toString()+"\n");
		Field field2 = class1.getField("str");//得到c1的指定公开字段,进一步可选择Field的方法进行数值修改
		System.out.print(field2.toString()+"\n");
		
		Method method1 = class1.getMethod("print", null);//通过Class的getMethod方法得到c1的公开方法
		System.out.print(method1+"\n");
		Method method2 = class1.getMethod("print1",int.class);
		System.out.print(method2+"\n");
		Method method3 = class1.getMethod("print2",	int.class,String.class);
		System.out.print(method3+"\n");
		
		Class<c1> class3 = c1.class;//通过类名.class获得c1类类型Class
		c1 c1newInstance = class3.newInstance();//使用newInstance方法通过Class动态创建c1类无参实例
		System.out.print(c1newInstance+"\n");
		
		Constructor<c1> con1 = class3.getConstructor(int.class);//先通过Class的getConstructo方法2r获取c1的构造方法
		c1 c1newInstance1 = con1.newInstance(520);//再使用newInstance方法通过Class动态创建c1类有参实例
		System.out.print(c1newInstance1+"\n");
		
		T<Integer> text1 = new T<Integer>(2018);//自定义泛型
		System.out.print(text1.getObject()+"\n");
		
		Class class4 = Class.forName("com.lyx.c1");//使用限定类型名获得c1类类型Class
		System.out.print(class4.getCanonicalName()+"\n");
		System.out.print(class4.getName()+"\n");
		
		ClassLoader classloader1 = ClassLoader.getSystemClassLoader();//获取系统类加载器
		Class class5 = Class.forName("com.lyx.T", true, classloader1);//通过指定的类加载器去加载得到T.class类类型
		//其中第二个布尔参数为是否初始化类,即是否加载该类的静态构造块和静态对象
		System.out.print(class5.getCanonicalName()+"\n");
		System.out.print(class5.getName()+"\n");
		System.out.print(classloader1+"\n");
	}

打印结果

class com.lyx.c1
com.lyx.c1
interface com.lyx.inter1
1537
public abstract interface
public int com.lyx.c1.i
public java.lang.String com.lyx.c1.str
public java.lang.String com.lyx.c1.str
public void com.lyx.c1.print()
public void com.lyx.c1.print1(int)
public void com.lyx.c1.print2(int,java.lang.String)
com.lyx.c1@5c647e05
com.lyx.c1@33909752
2018
com.lyx.c1
com.lyx.c1
com.lyx.T
com.lyx.T
sun.misc.Launcher$AppClassLoader@2a139a55

学习内容大概就是这些,如果以后在实际应用中发现了相关的问题我再回来补充吧~

猜你喜欢

转载自blog.csdn.net/p414897821/article/details/88086669