java 反射简单总结

版权声明:自然 https://blog.csdn.net/qq_38943922/article/details/87477051
package zr.test;

import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.net.URL;
import java.security.ProtectionDomain;

import study.core.Reflex;
import study.sqlite3.main.User;
import study.sqlite3.main.User.A;
import zr.annotation.Run;

/**
 * java 反射 
 * @author Administrator
 *
 */
public class Javareflex {
	public static void main(String[] args) throws Exception {
		//----理解class类
		
		@SuppressWarnings("deprecation")
		User user = new User();
		user.setUserCode("hello");
		System.out.println(user.getClass()==User.class);
		Class<? extends User> clazz1 = user.getClass();
		
		
		
		//转型
//		asSubclass 向上转型
		Reflex reflex = clazz1.asSubclass(Reflex.class).newInstance();
		reflex=clazz1.newInstance();
		Object properties = reflex.properties();
//		Class<? extends List> asSubclass = clazz1.asSubclass(List.class);
//		--判断父类
//		cast 向下转型
		Object o=user;
		User cast = user.getClass().cast(o);//
		
		
		//desiredAssertionStatus 断言状态
		boolean desiredAssertionStatus = clazz1.desiredAssertionStatus();
		
		
		//通过字符串获取字节码对象
		//forName
		Class<?> user1 = Class.forName(user.getClass().getName());
		System.out.println(user1);
		
		
//		getAnnotatedInterfaces  注解
		boolean annotationPresent = clazz1.isAnnotationPresent(Run.class);
		AnnotatedType[] annotatedInterfaces = clazz1.getAnnotatedInterfaces();
		AnnotatedType annotatedSuperclass = clazz1.getAnnotatedSuperclass();
		Run annotation = clazz1.getAnnotation(Run.class);
		Annotation[] annotations = clazz1.getAnnotations();
		Run[] annotationsByType = clazz1.getAnnotationsByType(Run.class);
		Run declaredAnnotation = clazz1.getDeclaredAnnotation(Run.class);
		Annotation[] declaredAnnotations = clazz1.getDeclaredAnnotations();
		Run[] declaredAnnotationsByType = clazz1.getDeclaredAnnotationsByType(Run.class);
		boolean annotation2 = clazz1.isAnnotation();
//		--运行对象
		
		
//		返回由Java语言规范定义的基础类的规范名称。
		String canonicalName = clazz1.getCanonicalName();
		
		
		//内部类
		Class<?>[] classes = clazz1.getClasses();
		Class<?>[] declaredClasses = clazz1.getDeclaredClasses();
		//通过内部类获取外部类
		Class<?> enclosingClass = A.class.getEnclosingClass();
		//通过匿名内部类获取当前所在构造方法
		Constructor<?> enclosingConstructor = clazz1.getEnclosingConstructor();
		Object properties1 = user.properties("reflex");
		Class<? extends Object> class1 = properties1.getClass();
		Constructor<?> enclosingConstructor2 = class1.getEnclosingConstructor();
		//通过匿名内部类获取当前所在方法
		user.test();
		Object properties2 = user.properties("reflex");
		Class<? extends Object> class11 = properties2.getClass();
		Method enclosingMethod = class11.getEnclosingMethod();
		//判断匿名类
		boolean anonymousClass = class11.isAnonymousClass();
		//判断局部类
		class Local{}
		boolean localClass = Local.class.isLocalClass();
		//判断成员类
		boolean memberClass = A.class.isMemberClass();
		
		
//		getClassLoader()
//		获取该类的类装载器。
//		实现java对象动态性
//		JAVA类装载方式,有两种:
//			1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
//			2.显式装载, 通过class.forname()等方法,显式加载需要的类
//		java类装载器
//		JDK 默认提供了如下几种ClassLoader
//		Bootstrp loader
//		Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,
//		-Xbootclasspath参数指定的路径以及%JAVA_HOME%/jre/classes中的类。
//		ExtClassLoader  
//		Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp 
//		loader.ExtClassLoader是用Java写的,具体来说就是 sun.misc.Launcher$ExtClassLoader,
//		ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有classes目录以及java.ext.dirs
//		系统变量指定的路径中类库。
//		AppClassLoader 
//		Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,
//		并且将AppClassLoader的父加载器指定为 ExtClassLoader。AppClassLoader也是用Java写成的,
//		它的实现类是 sun.misc.Launcher$AppClassLoader,
//		另外我们知道ClassLoader中有个getSystemClassLoader方法,
//		此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档,
//		它也是Java程序默认的类加载器。
//		 类加载器之间是如何协调工作的
//		 前面说了,java中有三个类加载器,问题就来了,碰到一个类需要加载时,它们之间是如何协调工作的,
//		 即java是如何区分一个类该由哪个类加载器来完成呢。 在这里java采用了委托模型机制,这个机制简单来讲,
//		 就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,
//		 那么才由自己依照自己的搜索路径搜索类”
		
		//--Service Provider Interface 服务提供
		ClassLoader classLoader = user.getClass().getClassLoader();
		//获取父类装载器
		ClassLoader parent = classLoader.getParent();
		ClassLoader parent2 = parent.getParent();
		InputStream resourceAsStream = classLoader.getResourceAsStream("read.txt");
		//类文件加密解密
		
		
//		getComponentType()
//		如果当前类表示一个数组,则返回表示该数组组件的Class对象,否则返回null。
		System.out.println(new String("H").getClass().getComponentType());
		System.out.println(new String[] {"90","80","70"}.getClass().getComponentType());
//		----数组判断
		
		//构造函数
//		getConstructor(Class[])
//		返回当前Class对象表示的类的指定的公有构造子对象。
		Constructor<? extends User> constructor = user.getClass().getConstructor(Integer.class,String.class);
		User user2 = constructor.newInstance(90,"自然");
		System.out.println(user2);
//		getConstructors()
//		返回当前Class对象表示的类的所有公有构造子对象数组。
		@SuppressWarnings("unused")
		Constructor<?>[] constructors = user.getClass().getConstructors();
//		getDeclaredConstructor(Class[])
//		返回当前Class对象表示的类的指定已说明的一个构造子对象。
		Constructor<? extends User> constructor2 = user.getClass().getDeclaredConstructor(Integer.class,String.class,String.class);
		constructor2.setAccessible(true);
		User user3 = constructor2.newInstance(90,"自然","指针");
		//-----通过私有构造函数创建对象
//		getDeclaredConstructors()
//		返回当前Class对象表示的类的所有已说明的构造子对象数组。
		Class<? extends User> clazz = user.getClass();
		Constructor<?>[] constructors2 = clazz.getDeclaredConstructors();
		AnnotatedType annotatedReceiverType = constructor2.getAnnotatedReceiverType();
		Class<? extends User> declaringClass = constructor2.getDeclaringClass();
//		--获取对象下所有构造函数
		
//		字段
//		getDeclaredField(String)
//		返回当前Class对象表示的类或接口的指定已说明的一个域对象。
		Class<? extends User> clazz3 = user3.getClass();
		Field field = clazz3.getDeclaredField("userId");
//		getDeclaredFields()
//		返回当前Class对象表示的类或接口的所有已说明的域对象数组。
		Field[] fields = clazz3.getDeclaredFields();
		//--获取所有字段
//		getDeclaredMethod(String,Class[])
//		返回当前Class对象表示的类或接口的指定已说明的一个方法对象。
//		getField(String)
//		返回当前Class对象表示的类或接口的指定的公有成员域对象。
//		Field field2 = clazz3.getField("userId");
//		--判断字段访问权限
//		getFields()
//		返回当前Class对象表示的类或接口的所有可访问的公有域对象数组。
		Field[] fields2 = clazz3.getFields();
		
		//方法
		Method method = clazz3.getDeclaredMethod("getUserId",Integer.class);
		Object invoke = method.invoke(user3,0);
//		getMethod(String,Class[])
//		返回当前Class对象表示的类或接口的指定的公有成员方法对象。
		Method method2 = clazz3.getMethod("getUserId");
		Object invoke2 = method2.invoke(user3);
//		getMethods()
//		返回当前Class对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
		Method[] methods = clazz3.getMethods();
		
		//枚举
		User[] enumConstants = clazz.getEnumConstants();
		boolean enum1 = clazz.isEnum();
		
		
		//接口
//		getInterfaces()
//		返回当前对象表示的类或接口实现的接口。
		Class<?>[] interfaces = clazz3.getInterfaces();
		Type[] genericInterfaces = clazz3.getGenericInterfaces();
//		isInterface()
//		判定指定的Class对象是否表示一个接口类型。
		boolean interface1 = clazz3.isInterface();
		
		//超类
		Class<?> superclass2 = clazz3.getSuperclass();
		Type genericSuperclass = clazz3.getGenericSuperclass();
		boolean assignableFrom = clazz3.isAssignableFrom(Object.class);
		//修饰权限
//		getModifiers()
//		返回该类或接口的Java语言修改器代码。
		int modifiers = clazz.getModifiers();
		
//		getName()
//		返回Class对象表示的类型(类、接口、数组或基类型)的完整路径名字符串。
		String name = clazz3.getName();
		String simpleName = clazz3.getSimpleName();
		
		//包
		Package package1 = clazz3.getPackage();
		
		//安全管理器
		ProtectionDomain protectionDomain = clazz3.getProtectionDomain();
		
		//资源
//		getResource(String)
//		按指定名查找资源
		URL url = clazz3.getResource("read.txt");
//		getResourceAsStream(String)
//		用给定名查找资源。
		InputStream inputStream = clazz3.getResourceAsStream("read.txt");
		
		//签名
//		getSigners()
//		获取类标记。
		Object[] signers = clazz3.getSigners();
		
		//当前泛型类型对象
		TypeVariable<?>[] typeParameters = clazz3.getTypeParameters();
		boolean instance2 = clazz3.isInstance(o);
//		isInstance(Object)
//		此方法是Java语言instanceof操作的动态等价方法。
		boolean instance = clazz3.isInstance(user3);

		//数组
//		isArray()
//		如果Class对象表示一个数组则返回true,否则返回false。
		boolean array = clazz3.isArray();
		
		//基础数据类型
//		isPrimitive()
//		判定指定的Class对象是否表示一个Java的基类型。
		boolean primitive = clazz3.isPrimitive();
//
		
		//创建实例
//		newInstance()
//		创建类的新实例。
		User user4 = clazz3.newInstance();
		
//将对象转换为字符串。
//		toString()
		String string = clazz3.toString();
		String genericString = clazz3.toGenericString();
		//合成类:https://blog.csdn.net/a327369238/article/details/52608805
		boolean synthetic = clazz3.isSynthetic();
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_38943922/article/details/87477051