Java第十六章课堂总结

发布时间:2023年12月20日

?通过java的反射机制,程序员可以更深入的控制程序的运行过程。例如,可在程序运行时对象用户输入的信息进行验证,还可以逆向控制程序的执行过程,讲解了反射,另外java还提供了Annotation注解功能,该功能建立在反射机制的基础上,包括定义Annotation类型的方法和程序运行时访问Anntation信息的方法。

16.1反射

通过java反射机制,可以在程序中访问以及装载到JVM中的java对象的描述实现方法。检查喝修改描述java对象本身的信息的功能 java反射机制功能十分强大,在java.lang.reflect包中提供了该功能的支持

众所周知,所有jvaa类俊继承了Object类在Object类中定义了一个getClass()方法 该方法返回了一个类信息为Class的对象?

? ? ? ? demo1 d1 = new demo1();
?? ??? ?Class c1 = d1.getClass();//先new一个对象然后使用getClass方法来获取
? ? ? ? //第二种方法
?? ??? ?Class c2= demo1.class;
? ? ? ? 第三种方法直接使用forName方法来获取 其中括号内传入的时包名和类名
?? ??? ?Class c3= Class.forName("com.cr.demo1");

利用Class类的对象demo1,可以访问用来返回该对象的demo1对象的描述信息

组成部分?? ?访问方法?? ?返回值类型?? ?说明
包路径?? ?getPackage()?? ?Package对象?? ?获取该类的存放路径
类名称?? ?getName()?? ?String对象?? ?获取该类名称
继承类?? ?getSuperclass?? ?Class对象?? ?获取该类的继承类
实现接口?? ?getInterfaces()?? ?Class型数组?? ?获取该类实现的所有接口
构造方法?? ?getConstructors()?? ?Constructor型数组?? ?获取所有权限为public的构造方法
getConstructor(Class<?>...parameterTypers)?? ?Constructor对象?? ?获取指定构造方法
getDeclaredConstructors()?? ?Constructor型数组?? ?获取所有构造方法
getDeclaredConstructors(Class<?>...parameterTypers)?? ?Constructor对象?? ?获取自动那个构造方法
方法?? ?getMethods()?? ?Method型数组?? ?获取所有权限为public的指定方法
getMethod(String name,Class<?>...parameterTypes)

Method对象?? ?获取权限为public的指定方法
getDeclardMethod()?? ?Method型数组?? ?获取所有方法
getDeclaredMethod(String name,Class<?>...parameterTypes)?? ?Method对象?? ?获取指定方法
成员变量?? ?getFields()?? ?Field数组?? ?获取所有权限为public的成员变量
getFields(String name)?? ?Field对象?? ?获取权限为public的指定的成员变量
getDeclaredFields()?? ?Field数组?? ?获取所有成员变量
getDeclaredField(String name)?? ?Field对象?? ?获取指定成员变量
内部类?? ?getClasses()?? ?Class型数组?? ?获取所有权限为public的内部类
getDeclaredClasses()?? ?Class型数组?? ?获取所有内部类
内部类的声明类?? ?getDeclaringClass()?? ?Class对象?? ?如果改类为内部类,则返回她的成员变量否则返回null

package com.cr;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
 
public class classdemo {
 
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, NoSuchFieldException {
		demo1 d1 = new demo1();
		Class c1 = d1.getClass();
		Class c2= demo1.class;
		Class c3= Class.forName("com.cr.demo1");
		System.out.println(c2.getName());
		System.out.println(c2.getPackageName());
		//获取构造方法
		Constructor[] cs = c2.getConstructors();
		Constructor c = c2.getConstructor(String.class);
		System.out.println(c.getName());
		Parameter[] p =	c.getParameters();
		//获取成员变量
		Field[] fs = c2.getFields();
		Field f = c2.getDeclaredField("i");
		System.out.println(f.getName());
		//获取成员方法
		Method[] ms =c2.getMethods();
		Method m = c2.getMethod("getStr", null);
		System.out.println(m.getName());
		m.getExceptionTypes();//获取所有异常
	}
 
}

@Override限定重写父类方法? 作用范围使用在成员方法上

@SuppresWarnings(警告)抑制编译器警告//作用范围类成员属性? 成员方法

@Deprecated 标识已经过时//作用范围类成员属性? 成员方法

public @interface demo{
}

package com.cr;
//注解类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Retention(value =RetentionPolicy.RUNTIME )//在源码时生效 
@Target(value = {ElementType.CONSTRUCTOR,ElementType.FIELD ,ElementType.METHOD,ElementType.TYPE  })
//设置什么方法可以使用 如:ElementType.CONSTRUCTOR是构造方法  FIELD 适用于成员变量和枚举常量  METHOD用于方法    TYPE是用于类和接口枚举 Annotation类型
public @interface MyAnnotation {
	String value()default"田";
	int i ()default 8;	
}
package com.cr;
 
@MyAnnotation(i = 5, value = "联系类")//给某给类注解   //想要给成员变量或者普通方法注解的话  需要把@MyAnnotation放在他的上一行
public class demo {
	@MyAnnotation
	String str;
	@MyAnnotation
	public String getStr() {
		return str;
	}
}

如果在定义Annotation类型时讲@Retention设置为RetentionPollcy.RUNTIME,那么在运行程序时,通过反射就可以获取相关的Annotation信息 ,如获取构造方法,字段和方法Annotation信息。

Cpmstructor类Field和Method类均继承了isAccessibleObject类,在AccessibleObject中定义了3个关于Annotation的放啊,其中,方法发isAnnotationPresent(Class<?extends Annotation>AnnotationClass)用来查看是否添加了指定类型的Annotation,如果是则返回true 否则返回false;方法getAnnotation(Class<T>AnnotationClass)用来获取指定类型的Annotation如果存在则返回相应的对象,则返回null方法getAnnotations()用来获取所有的Annotation改方法将返回Annotation数组

在constructor类和Method类中还定义了getParameterAnnotations()用来获得所有参数添加Annotation,将以Annotation可u下的二位数组返回,在数组中的素和顺序与声明的顺序相同。如果没有参数则返回一个长度为0的数组,如果存在未添加的Annotation的参数将用一个长度为0的嵌套数组占位。

文章来源:https://blog.csdn.net/2201_75710189/article/details/135086047
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。