2、通过反射获取Class对象: 所有的类都可以通过反射获取其Class对象。 下面通过例子列举获取类的Class对象的三种方式:
//新建Person类
class Person{
String name;
int age;
int id;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
//测试
public class test02 {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Person();
//方式一、通过包名获取
Class class1 = Class.forName("com.reflection.Person");
System.out.println(class1.hashCode());
//方式二、通过对象获取
Class class2 = person.getClass();
System.out.println(class3.hashCode());
//方式三、通过类获取
Class class3 = Person.class;
System.out.println(class3.hashCode());
}
}
输出结果: 结论:三种方式获取的Class对象为同一个。 3、获取类的运行时结构
public class test03 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
Class c1 = Class.forName("com.reflection.Person");
//获得类的名字
String name = c1.getName();//获得包名加类名
String simpleName = c1.getSimpleName();//获得类名
//获得类的属性
Field[] fields = c1.getFields();//获得类的所有公有属性
Field[] declaredFields = c1.getDeclaredFields();//获得类的所有属性
Field field = c1.getField(name);//获得类的指定公有属性
Field declaredField = c1.getDeclaredField(name);//获得类的指定属性(所有类型均可)
//获得类的方法
Method[] method = c1.getMethods();//获得本类及其父类的所有公有方法
Method[] declaredMethods = c1.getDeclaredMethods();//获得本类的所有方法
Method getName = c1.getMethod("getName", null);//获取指定方法(本类及其父类的所有公有方法)
Method setName = c1.getDeclaredMethod("setName", String.class);//获取指定方法(本类的所有方法)
//获得类的构造器
Constructor[] constructors = c1.getConstructors();//获取所有公有构造器
Constructor[] declaredConstructors = c1.getDeclaredConstructors();//获取所有构造器
Constructor constructor = c1.getConstructor(String.class, int.class);//获取指定公有构造器
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);//获取指定构造器
}
}
4、通过反射构造对象
public class Test04 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获得Class对象
Class c1 = Class.forName("com.reflection.Person");
//通过反射创建对象
Person person = (Person)c1.newInstance();//本质上是调用了无参构造器
Constructor constructor = c1.getDeclaredConstructor(String.class,int.class);//获取有参构造器
Person person2 = (Person) constructor.newInstance("name",18);//调用有参构造器创建对象
//通过反射调用普通方法
Method setName = c1.getDeclaredMethod("setName", String.class);//获取方法
setName.invoke(person,"name");//通过invoke调用方法
//通过反射操作属性
Field name = c1.getDeclaredField("name");//获取name属性
name.setAccessible(true);//关闭安全检测,关闭后可以访问私有属性(true为关闭,false为打开,默认是false)
name.set(person,"lalala");//设置属性的值
}
}
5、通过反射获取注解的信息 创建类和注解
@Testclass("db_Student2")//类注解
//创建学生类
class Student2{
@Testfield(columnname = "name",type = "varchar",length = 20)//属性注解
String name;
@Testfield(columnname = "age",type = "int",length = 3)
int age;
@Testfield(columnname = "ID",type = "int",length = 10)
int ID;
public Student2() {
}
public Student2(String name, int age, int ID) {
this.name = name;
this.age = age;
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;
}
public int getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
}
//类的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Testclass{
String value();
}
//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Testfield{
String columnname();
String type();
int length();
}
测试
public class test05 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
Class c1 = Class.forName("com.zjrcu.reflection.Student2");
//通过反射获得注解
Annotation[] annotations = c1.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
//通过反射获得注解value的值
Testclass testclass = (Testclass)c1.getAnnotation(Testclass.class);
String value = testclass.value();
System.out.println(value);
//获取类中指定注解的value值
Field f = c1.getDeclaredField("name");
Testfield testfield = (Testfield) f.getAnnotation(Testfield.class);
System.out.println(testfield.columnname());
System.out.println(testfield.length());
System.out.println(testfield.type());
}
}
总结到此这篇关于Java中的注解和反射的文章就介绍到这了,更多相关Java注解和反射内容请搜索社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持社区! | |||||||||||||||||||||