第十六章 反射与注解

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

 第十六章 反射与注解_第1张图片

 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 标识已经过时//作用范围类成员属性  成员方法

自定义注解

在定义Annotation类型时,也需要用到来i当以的interface关键字,但需要在interface关键字前加一个@符号,即定义Annotation类型的关键字@interface,这个关键字的隐含意思是继承java.lang.annotation.Annotation接口.如下:

public @interface demo{
}

枚举类中ElementType中的枚举常量使用方法如下所示:

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;
	}
}

你可能感兴趣的:(java,python,开发语言)