注解与反射
内置注解
-
@Override 重写的注释
-
@Deprecatde 不推荐使用,,但是可以使用,或者有更好的方式
-
@SuppressWarnings 用来抑制编译时的警告信息与前两个注释不同,你需要添加一个参数才能正确使用,这些参数已经是定义好的,
-
"all"
-
-
"uncheched",deprecation"
-
等等
-
package demo04;
元注解
-
@Target 表示我们的注解可以用在哪些地方
-
@Retention 表示在源码还是类或者是运行时
package demo04;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
自定义注解
package demo04;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
反射
-
Java Reflection(反射)是java被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得 任何类的内部信息,,并能直接操作任意对象的内部属性及方法。
-
正常方式:引入需要的“包”名称--->通过new实例化--->取得实例化对象
-
反射方式:实例化独享--->getClass()方法--->得到完整的“包类”名称
-
优点: 可以实现动态的创建对象和编译,,体现出很大的灵活性
-
缺点:对性能有影响,使用反射基本上是一种解释操作,我们可以告诉JVM,,我们希望做什么并且满足我们的要求这类操作总是慢于直接执行相同的操作
获得反射对象
package demo04;
public class Test04 {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> aClass = Class.forName("demo04.User");
Class<?> aClass1 = Class.forName("demo04.User");
Class<?> aClass2 = Class.forName("demo04.User");
Class<?> aClass3 = Class.forName("demo04.User");
System.out.println(aClass.hashCode());
System.out.println(aClass1.hashCode());
System.out.println(aClass2.hashCode());
System.out.println(aClass3.hashCode());
}
}
class User{
int age;
String name;
int id;
public User() {
}
public User(int age, String name, int id) {
this.age = age;
this.name = name;
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
得到Class类的几种方式
package demo05;
public class Testclass {
public static void main(String[] args) throws ClassNotFoundException {
//创建对象
Person person = new Student();
Class c1 = person.getClass();
System.out.println(person.name = "小王");
System.out.println(c1.hashCode());
System.out.println("======================");
//Class.forname()获得
Class c2 = Class.forName("demo05.Student");
System.out.println(c2.hashCode());
System.out.println("=====================");
//通过类名.class访问
Class<Student> c3 = Student.class;
System.out.println(c3.hashCode());
System.out.println("====================");
//基本内置类型都有一个包装类,包装类都有一个TYPE属性
Class<Integer> c4 = Integer.TYPE;
System.out.println(c4);
System.out.println("=====================");
//获得父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person {
String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
所有类型的class对象
package demo05;
import java.lang.annotation.ElementType;
public class Test01 {
public static void main(String[] args) {
Class c1 = Class.class;
System.out.println(c1);
Class c2 = Override.class;
System.out.println(c2);
Class c3 = String[].class;
System.out.println(c3);
Class c4 = int[][].class;
System.out.println(c4);
Class c5= void.class;
System.out.println(c5);
Class c6= ElementType.class;
System.out.println(c6);
Class c7 = int.class;
Class c8 = Integer.class;
Class c9 = Comparable.class;
System.out.println(c7);
System.out.println(c8);
System.out.println(c9);
}
}
获取类的运行时的结构
package demo06;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//获取类的信息
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("demo06.UserBean");
/* Class<UserBean> userBeanClass = UserBean.class;
System.out.println(userBeanClass.getName());*/
//获得完整类的名字
System.out.println(c1.getName());
//获得简单的类名字
System.out.println(c1.getSimpleName());
System.out.println("==========================");
//获得类的属性
//只能获得共有属性
Field[] fields = c1.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("==============================");
//所有属性都能获得
Field[] declaredFields = c1.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("============================");
//获取指定共有属性(如果获得属性时非public,会报异常)
Field field1 = c1.getField("sex"); //会报异常,因为sex公共的
System.out.println(field1);
/* Field field = c1.getField("hobby"); //会报异常,因为name是私有的
System.out.println(field);*/
System.out.println("============================");
//获得指定所有类型属性
System.out.println(c1.getDeclaredField("name"));
System.out.println("============================");
//只能获得指定的public方法
Method method = c1.getMethod("getName",null);
System.out.println(method);
System.out.println("======================================");
//指定所有类型方法都能获得
Method declaredMethod = c1.getDeclaredMethod("getHobby",null);
System.out.println(declaredMethod);
System.out.println("===========================================");
//获得所有public的方法,获得本类以及父类所有的public方法
Method[] methods = c1.getMethods();
for (Method method1 : methods) {
System.out.println(method1);
}
System.out.println("================================");
//获得所有的的本类所有类型的方法,不能获取父类的方法
Method[] declaredMethods = c1.getDeclaredMethods();
for (Method declaredMethod1 : declaredMethods) {
System.out.println(declaredMethod1);
}
}
}
class
