Annoation

内置注解:

(1)@Override:此注解用于修饰方法,表示一个方法明打算重写超类中的方法。

(2)@Deprecated:此注解可以修饰方法、属性、类,表示不鼓励程序员使用这样的元素,通常因为它很危险或存在更好的选择。

(3)@SuppressWarnings:用来抑制编译时的警告信息(需要添加一个参数才能正确使用)。

元注解:负责注解其它注解

@target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)。

@Retention:表示需要在什么级别保存该注解信息。

反射(reflection):Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

public class Hello
{
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("com.user");
            //获取类的名字
            System.out.println(clazz.getName());//获取保命+类名(类的全路径)
            System.out.println(clazz.getSimpleName());//获取类名
            //获取属性信息
            //Field[] fields = clazz.getFields();//只能获取public的field
            Field[] fields = clazz.getDeclaredFields();//获取所有的field
            Field field = clazz.getDeclaredField("name");
            //获取方法信息
            //如果方法有参数,则必须传递参数类型对应的class对象
            Method methods = clazz.getDeclaredMethod("name", String.class);

            //获取构造器信息
            //无参构造器
            Constructor constructor = clazz.getDeclaredConstructor();
            //有参数构造器
            Constructor constructor1 = clazz.getDeclaredConstructor(String.class);
            //获取注解
            Annotation annotation = clazz.getDeclaredAnnotation(Constructor.class);

        } catch (Exception  e) {
            e.printStackTrace();
        }
    }
}
public class Hello
{
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("com.user");
                //通过反射,构造对象
               Object object = clazz.newInstance();
               //通过有参构造方法构造对象
               Constructor c = clazz.getConstructor(String.class);
                Object object1 = c.newInstance("name");
                //通过反射API调用普通方法
               Method method = clazz.getDeclaredMethod("setUsername", String.class);
               method.invoke("name");
               //通过反射API操作属性
               Field f = clazz.getDeclaredField("username");
               //私有属性必须设置该值才能被访问
                f.setAccessible(true);
               f.set(object, "name");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

posted on 2019-10-03 17:09  棽犹  阅读(245)  评论(0编辑  收藏  举报

导航