在Object类中定义了一个getClass( )方法,该方法返回一个类型为Class的对象。这个方法可以引用方法对调用getClass()方法的对象中的类的变量,构造器,方法,注释等信息进行访问和修改。例如:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test6 {
public static void main(String[] args) {
Student zhangsan = new Student();
Class<? extends Student> clazz = zhangsan.getClass();//这里直接用类名(Student )去调用getClass()也是可以的
Field [] f = clazz.getDeclaredFields();//获得声明的变量,返回一个Field的数组。
Method[] fields = clazz.getDeclaredMethods();//获得声明的方法,返回一个Method的数组。
for (int i = 0; i < fields.length; i++) { //遍历Method的数组数组。
System.out.println(fields[i].getName());
Class [] p = fields[i].getParameterTypes(); //获得方法的参数,返回一个Class数组
for (int j = 0; j < p.length; j++) {
System.out.println(p[j].getName()); //打印参数的类型。
}
}
try {
Field filed = clazz.getDeclaredField("age");//获得变量age
filed.setAccessible(true);//取消对权限的检测
filed.setInt(zhangsan,30);//改变张三的年龄。
filed.setAccessible(false);
System.out.println(zhangsan.getAge());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public class Student {
private int age =20;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String name;
private String sex;
public void run(){
System.out.println("跑");
}
}
这只是Class的一点点应用。更多的应用可参看API主要是将一个类作为一个对象来处理。
重点掌握
这里重点掌握的是Field的用法,在Android中的富文件中用到。
Class a = Stident.getClass();//也可以用Student的对象去调用getClass()
Field as=a.getDeclaredFields("属性的名称")//根据变量的名称获得变量的对象
int ass=as.getInt(object)//获得某一对象object的变量的值。这里在android中object有时可以随便写。
Annotation功能
此功能主要是对代码进行注解:
代码:
主函数:
public class Test7 {
public static void main(String[] args) {
Clazz clazz = new Clazz();
System.out.println(clazz.lisi.sex);
}
}
public class Student {
String name;
String sex;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import java.lang.reflect.Field;
public class Clazz {
@MyAnnotation(mage =20,msex="男") //对zhangsan变量进行注解
public Student zhangsan;
@MyAnnotation(mage =21,mname="lisi",msex="男")
public Student lisi;
//@MyAnnotation(mage =22,mname="lisi",msex="女")
public Student wangwu;
public Clazz(){
zhujie();
}
public void zhujie(){
Class<? extends Clazz> cla = Clazz.class;
Field [] fields = cla.getDeclaredFields();//获得Clazz的变量
for (int i = 0; i < fields.length; i++) {
Field field= fields[i];
MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);//获得变量的注解
if(annotation !=null){//如果变量有注解的话
field.setAccessible(true);
Student student = new Student();
student.setAge(annotation.mage());//对对象student对象的变量赋初值
student.setName(annotation.mname());
student.setSex(annotation.msex());
try {
field.set(this, student); //将student变量赋值给Clazz中的变量。
field.setAccessible(false);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD ) //FIELD表示用于成员变量和枚举常量
@Retention(RetentionPolicy.RUNTIME) //RUNTIME表示在运行时加载Annotation到JVM中,有效面积最大。
public @interface MyAnnotation {
String mname()default "张三";
String msex();
int mage();
}
这些东西并不常用等到用的时候再深入的了解。