Java的第十六章:反射与注解

int i,i2,i3;
public Demo1(){
	
}
public Demo1(String s,int i) {
	this.s=s;
	this.i=i;
}
public Demo1(String...strings) {
	if(0<strings.length)
		i=Integer.valueOf(strings[0]);
	if(1<strings.length)
		i2=Integer.valueOf(strings[1]);
	if(2<strings.length)
		i3=Integer.valueOf(strings[2]);
}
public void print() {
	System.out.println("s="+s);
	System.out.println("i="+i);
	System.out.println("i2="+i2);
	System.out.println("i3="+i3);
}

}



import java.lang.reflect.Constructor;
import java.lang.reflect.Executable;

import com.mr.Demo1;
public class Demo {
public static void main(String[] args) {
Demo1 d1=new Demo1(“10”,“20”,“30”);
Class<?extends Demo1>Demo1Class=d1.getClass(); Constructor[] declaredConstructors=Demo1Class.getDeclaredConstructors(); for(int i=0;i


运行结果:


![](https://img-blog.csdnimg.cn/c2f3a3d4a408446299cef1879c2d7a69.png)


#### 访问成员变量


        在通过下列一组方法去访问成员变量时,将返回 Field 类型的对象或数组。


![](https://img-blog.csdnimg.cn/72319dfe36754d06a500d3719746292c.jpeg)


代码案例如下:



package com.mr;
public class Demo1 {
int i;
public float f;
protected boolean b;
private String s;
}



import java.lang.reflect.Field;
import com.mr.Demo1;

public class Demo {
public static void main(String[] args) {
Demo1 example=new Demo1();
Class exampleC=example.getClass();
Field[]declaredFields=exampleC.getDeclaredFields();//获取所有成员变量
for(int i=0;i<declaredFields.length;i++) {//遍历成员变量
Field field=declaredFields[i];
System.out.println(“名称为:”+field.getName());
Class fieldType=field.getType();
System.out.println(“类型为:”+fieldType);
boolean isTurn=true;
while(isTurn) {
//如果该成员变量的访问权限为private或protect,则抛出异常,即不允许访问
try {
isTurn=false;
//获取成员变量值
System.out.println(“修改前的值为:”+field.get(example));
if(fieldType.equals(int.class)) {//判断成员变量的类型是否为int型
System.out.println(“利用方法setInt()修改成员变量的值”);
field.setInt(example,168);//为int型成员变量赋值
}else if(fieldType.equals(float.class)) {//判断成员变量的类型是否为float型
System.out.println(“利用方法setFloat()修改成员变量的值”);
field.setFloat(example,99.9F);//为float型成员变量赋值
}else if(fieldType.equals(boolean.class)){//判断成员变量的类型是否为boolean型
System.out.println(“利用方法setBoolean()修改成员变量的值”);
field.setBoolean(example,true);//为boolean型成员变量赋值
}else{
System.out.println(“利用方法set()修改成员变量的值”);
field.set(example,“MWQ”);//为不同类型的成员变量赋值
}
//获取成员变量值
System.out.println(“修改后的值:”+field.get(example));
}catch(Exception e) {
System.out.println(“在设置成员变量值时抛出异常,”+“下面执行setAccessible()方法”);
field.setAccessible(true);//设置为允许访问
isTurn=true;
}
}
System.out.println();
}
}
}


运行结果:


![](https://img-blog.csdnimg.cn/72bda2923ceb48b79e817d754bfa6e38.png)


#### 访问成员方法


        在通过下列一组方法访问成员方法时,将返回 Method 类型的对象或数组。


![](https://img-blog.csdnimg.cn/b912b44bde144ce9850d732c8519840b.jpeg)


## Annotation 注解功能


        Java提供了 Annotation 注解功能 ,该功能可用于类、构造方法、成员变量、成员方法、参数等的声明中。该功能不影响程序的运行,但是会对编译器警告等辅助工具产生影响。


#### 定义 Annotation 类型


        在定义  Annotation 类型时,也需要用到用来定义接口的 interface 关键字,但需要在 interface字前加一个 “@” 符合,即定义 Annotation 类型的关键字为 @interface,这个关键字的隐含意思是继承了 java.lang.annotation.Annotation 接口。


![](https://img-blog.csdnimg.cn/cffe7fde10464bd8a2e1a53fc4fead22.png)


 ![](https://img-blog.csdnimg.cn/d5d81718ab154b5f9c9aa36bd15d963b.jpeg)


![](https://img-blog.csdnimg.cn/f83123c2e75e4d38bc99a99b603eab4f.jpeg)




import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//用于字段、方法和参数
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)//在运行时加载Annotation到JVM中
public @interface Field_Method_Parameter_Annotation {
String describe();//定义一个没有默认值的String型成员
Class type()default void.class;//定义一个具有默认值的Class型成员
}



public class Record {
@Field_Method_Parameter_Annotation(describe=“编号”,type=int.class)
//注释字段
int id;
@Field_Method_Parameter_Annotation(describe=“姓名”,type=String.class)
String name;

@MyAnnotation()
//采用默认值注释构造方法
public Record(){
}

@MyAnnotation("立即初始化构造方法")
//注释构造方法
public Record(@Field_Method_Parameter_Annotation(describe="编号",type=int.class)int id,
	@Field_Method_Parameter_Annotation(describe="姓名",type=String.class)String name){
	this.id=id;
	this.name=name;
}

@Field_Method_Parameter_Annotation(describe="获取编号",type=int.class)
//注释方法
public int geInt() {
	return id;
}
	
@Field_Method_Parameter_Annotation(describe="设置编号")
//成员type采用默认值注释方法
public void seInt(
	//注释方法的参数
	@Field_Method_Parameter_Annotation(describe="编号",type=int.class)int id){
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值