public class testMain {
@myAnnoation(name="huang",school = {"111","222"})
public void test1(){
}
}
//定义一个注解
//表示注解范围
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//表示注解可以用在哪些地方
@Retention(value = RetentionPolicy.RUNTIME)
//表示能否将注解生成在doc中
@Documented
//子类可以继承父类
@Inherited
@interface myAnnoation{
//注解参数:参数类型+参数名();
//default"":表示默认为空
String name()default "";
int age()default 0;
int id()default -1;//-1表示不存在
String[] school()default {"111","222","333"};
}
反射机制提供的功能:
优点:
缺点:
相关API:
class类:
public final Class getClass()
public class testReflection {
public static void main(String[] args) throws Exception {
User user=new People(1,2);
System.out.println(user.toString());
//1.通过对象获得
Class c1=user.getClass();
System.out.println(c1.hashCode());
//2.forName获得
Class c2=Class.forName("test01.People");
System.out.println(c2.hashCode());
//3.通过类名获得
Class c3=People.class;
System.out.println(c3.hashCode());
//获得父类类型
Class c4=c1.getSuperclass();
System.out.println(c4);
}
}
//实体类
class User{
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
class People extends User{
public People() {
}
public People(int id, int age) {
super(id, "xiaowang", age);
}
}
有class对象的类型:
-只要元数类型一样,就是同一个Class
Class a1=Object.class; //类
Class a2=Comparable.class; //接口
Class a3=String[].class; //一维数组
Class a4=int[][].class; //二维数组
Class a5=Override.class; //注解
Class a6= ElementType.class;//枚举
Class a7=Integer.class; //基本数据类型
Class a8=void.class; //void
Class a9=Class.class; //Class
类加载器:
//通过反射,动态创建对象
public class TestClass {
public static void main(String[] args) throws Exception{
//获得Class对象
Class user=Class.forName("test01.User");
//构造对象
User u1=(User) user.newInstance(); //本质上调用了无参构造器
System.out.println(u1);
//通过构造器创建对象
Constructor constructor=user.getConstructor(int.class,String.class,int.class);
User u2=(User) constructor.newInstance(1,"huang",2);
System.out.println(u2);
//通过反射调用普通方法
User u3=(User)user.newInstance();
Method sets = user.getDeclaredMethod("Set",int.class);
//invoke:激活的意思
//(对象,方法值)
sets.invoke(u3,100);
System.out.println(u3);
//通过反射操作属性
User u4=(User)user.newInstance();
Field id = user.getDeclaredField("id");
//不能直接操作私有属性
//要关闭安全检测
id.setAccessible(true);
id.set(u4,18);
System.out.println(u4);
}
}
例子:
public class TestORM {
public static void main(String[] args) throws Exception {
//获得对象
Class s1=Class.forName("test01.student");
//获得注解
Annotation[] annotations=s1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
//获得注解的value值
StudentMsg msg=(StudentMsg) s1.getAnnotation(StudentMsg.class);
System.out.println(msg.value());
//获得指定属性注解信息
Field f=s1.getDeclaredField("id");
FieldMsg msg2=(FieldMsg) f.getAnnotation(FieldMsg.class);
System.out.println(msg2.ColName());
}
}
@StudentMsg("db_student")
class student{
@FieldMsg(ColName ="db_id",Type = "int",Length = 10)
private int id;
@FieldMsg(ColName ="db_name",Type = "String",Length = 10)
private String name;
@FieldMsg(ColName ="db_age",Type = "int",Length = 3)
private int age;
public student() {
}
public student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
//类名注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface StudentMsg{
String value();
}
//属性注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldMsg{
String ColName();
String Type();
int Length();
}