1.内置注解
(1)@注解名
(2)常见内置注解
@Override//重写父类,接口方法
2.自定义注解
(1)@Interface + 注解名可以自定义一个注解
(2)@Target(Element.METHOD)//表示该注解可用在什么地方,Element的枚举变量有类(Element.TYPE),方法,源代码。。。
(3)@Retention(RetentionPolicy.RUNTIME)//表示注解在什么地方有效,比如运行时
@Interface myAnnotation{
//注解参数-----参数类型+参数名()
String name() default "";//default ""------默认值“”
int old();
}
3.反射(Reflection)
(1)每个类加载在虚拟机中,只有一个Class类的对象
(2)Class类的对象可以知道类的所有构造
(3)获取Class类的对象获取三种方法
Class c1 = 类名.class
Class c2 = Class.forName("com.source.user")//类的package路径
Class c3 = new 类目().getClass();
(4)Class类对象方法
Class c1 = 类名.class
Class c2 = c1.getSupperClass()//获得父类的Class对象
System.out.println(c1.getName());//获得包名+类名
System.out.println(c1.getSimpleName());//获得类名
Field[] fields = c1.getFields();//获得所有public属性
Field[] fields1 = c1.getDeclaredFields();//获得所有属性
foreach(Field field :fields){
System.out.println(fields );//获得类名
}
Method[] method = c1.getMethods()//获得public方法
Method[] method1= c1.getDeclaredMethods()//获得所有方法
Constructor[] constructors = c1.getConstructors()//获得public构造器
Constructor[] constructors1 = c1.getDeclaredConstructors()//获得所有构造器
//以上都可以获得指定的方法,属性,构造器
c1.getDeclaredMethod()---getDeclaredField()----c1.getDeclaredConstructor()
参数也要用class类对象
int --Int.class
String ---String.class
..........................
(5)class类对象运用
【1】获取新的对象
package com.text.User
//实体类(不全,懒得写)
class User{
private String name;
private int old;
public User(){}
public User(String name, int old){
this.name = name;
this.old = old;
}
public String getName(){return this.name;}
public void setName(String name){this.name = name;}
public int getold(){return this.old;}
public void setold(int old){this.old = old;}
}
Class c1 = Class.forName("com.text.User ");
User user = (User)c1.newInstance();//获得一个无参构造方法的类的对象
//获得有参构造器再获取对象
ConStructor cs = c1.getDeclaredConstructor(String.class, Int.class );
User user = (User)cs.newInstance("张三",666);
//获得方法
Method md = c1.getDeclaredMethod("setName", String.class);
md.invoke(user, "老王")
System.out.println(c1.getName());//老王
//获得属性
Field field = c1.getDeclaredField("old");
c1.setAccessible(true)//old是私有的,关闭程序的安全检测
field.set(user, 18);
System.out.println(c1.getOld());//18