java.lang.annotation.Annotation
接口[public|final] @interface 注解名
{
注解元素
}
数据类型 注解元素名() [default 默认值];
package com.bjpowernode.java_learning;
import java.lang.annotation.Retention;
import java.lang.reflect.Field;
@Retention(RetentionPolicy.RUNTIME)//元注解,运行时保留注解,必须有,否则注解值读不出来
@interface ApplianceMaker //定义注解
{
//定义注解元素,都有默认值
public String type() default "电视机";
public String id() default "001";
public String maker() default "TCL有限公司";
public String address() default "广东省惠州市";
}
@Retention(RetentionPolicy.RUNTIME)
@interface ApplianceSaler {
public String name() default "京东";
public String id() default "001";
public String address() default "北京";
}
@Retention(RetentionPolicy.RUNTIME)
@interface AppliancePrice{
//注解元素只有一个,名为value
public int value() default 1200;
}
class Appliance{
//为域maker加注解,给部分元素赋值,其余使用默认值
//如果注解元素都用默认值,则直接写@ApplianceMaker
@ApplianceMaker(type="电脑",id="201")
public String maker;
@ApplianceSaler(name="苏宁",id="222",address="南京")
public String saler; //域有注解
@AppliancePrice(999) //也可以写成"value=999",因为只有一个,此处只写出值即可
public int price; //域有注解
public void setMaker(String m) {
maker = m;
}
public String getMaker() {
return maker;
}
public void setSaler(String saler) {
this.saler = saler;
}
public String getSaler() {
return saler;
}
public void setPrice(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
public class D144_1_Test {
public static void main(String[] args) {
System.out.println(readAnnotation(Appliance.class));
}
//读取注解信息
private static String readAnnotation(Class aClass) {
String maker="制造商:";
String saler="销售商:";
String price="价格:";
Field fields[] = aClass.getDeclaredFields(); //获取Appliance类的所有字段
for(Field aField:fields) {
//对每一个字段判断其注解类型
if(aField.isAnnotationPresent(ApplianceMaker.class)) {
ApplianceMaker aMaker; //声明一个注释变量
//调用getAnnotation()方法获得在aField域上的注解“实例”
aMaker = (ApplianceMaker)aField.getAnnotation(ApplianceMaker.class);
maker+=aMaker.type() + " "; //获取type元素的值
maker+=aMaker.id() + " ";
maker+=aMaker.maker() + " ";
maker+=aMaker.address() + "\n";
}else if(aField.isAnnotationPresent(ApplianceSaler.class)) {
//字段的注解是ApplianceSaler类型
ApplianceSaler aSaler;
aSaler=(ApplianceSaler)aField.getAnnotation(ApplianceSaler.class);
saler+=aSaler.name()+" ";
saler+=aSaler.id() +" ";
saler+=aSaler.address() + "\n";
}else if(aField.isAnnotationPresent(AppliancePrice.class)) {
AppliancePrice thePrice;
thePrice = (AppliancePrice)aField.getAnnotation(AppliancePrice.class);
price+=thePrice.value();
}
}
return maker+saler+price;
}
}
java.lang.Class
类和java.lang.reflect
包中的Field类、Constructor类、Method类和Array类Object obj = new Object();
Class c1 = obj.getClass();//通过Object类中的getClass()方法来获取Class对象
class c2 = Class.forName("java.lang.Integer");
//通过Class类的静态方法forName()来获取Class类的对象
//方法中的参数必选是类或者接口的全名,注意要捕捉ClassNotFoundException
Class c3 = Integer.class;//通过类名直接获取
类型 | 方法 | 说明 |
---|---|---|
Class | forName(String className) | 返回指定字符串名的类或者接口的Class类对象 |
String | getName() | 返回此Class对象所表示的实体的全限定名 |
Constructor | getConstructor(Class.. parameterTypes) | 返回此Class对象所表示的实体的指定public构造方法 |
Constructor[] | getConstructor() | 返回所有的public构造方法 |
Constructor | getDeclaredConstructor(Class.parameterTypes) | 返回Class类对象所表示的实体的指定构造方法 |
Constructor[] | getDeclaredConstructors() | 返回所有的构造方法 |
Annotation[] | getDeclardAnnotations() | 返回此元素上的所有的注解 |
Field | getField() | 返回此Class对象所表示的类或者接口指定的public字段 |
Field[] | getFields() | ...............实体的所有的public字段 |
Field[] | getDeclaredFields(String name) | .......实体的所有字段 |
Class[] | getInterface() | .......类或者接口实现的所有接口Class列表 |
Method | getMethod(String name,Class...paramterTypes) | 返回指定的方法,name时指定的方法的名称,parametersTypes是指定方法的参数数据类型 |
package com.bjpowernode.java_learning;
import java.lang.reflect.*;
public class D144_4_ClassTest {
public static void main(String[] args) {
try {
//获取指定类的Class对象
Class c = Class.forName("java.util.Date");
//获取类的包信息
Package p = c.getPackage();
//包名
String pname = p.getName();
System.out.println("Date类包信息:"+p);
System.out.println("Date类包名"+pname);
//获取类的修饰符
int m = c.getModifiers();
String str = Modifier.toString(m);
System.out.println("Date的修饰符:"+str);
System.out.println("Date类名:"+c.getName());
//获取Date类的字段
Field[] f = c.getDeclaredFields();
System.out.println("---循环输出Date类中的字段名---");
for(Field field:f) {
System.out.print(field.getName() + " ");
}
System.out.println();
//获取类的构造方法
Constructor[] con = c.getDeclaredConstructors();
System.out.println("--循环输出Date类中的构造方法信息---");
for(Constructor cc:con) {
System.out.println(cc.getName() + "的修饰符:"+Modifier.toString(cc.getModifiers()));
Parameter[] ps = cc.getParameters();
System.out.println(cc.getName() + "的参数:");
for(Parameter pp :ps) {
System.out.print(pp.getName() + " ");
}
System.out.println();
}
}catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
}
https://github.com/ruigege66/Java/blob/master/D144_1_Test.java
https://github.com/ruigege66/Java/blob/master/D143_2_SubClass.java
https://github.com/ruigege66/Java/blob/master/D143_3_Test.java
https://github.com/ruigege66/Java/blob/master/D144_4_ClassTest.java
原文:https://www.cnblogs.com/ruigege0000/p/13800493.html