-
什么是反射
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法。
-
创建Class
因为class类的构造器是私有的,因此不可以像普通类一样new一个Class对象,但是却可以通过已有的类得到一个Class对象,有三种方式,如下
Class clazz1 = Dog.class; 这说明任何一个类都有一个隐含的静态成员变量class,这种方式是通过获取类的静态成员变量class得到的
Class clazz2 = dogi.getClass(); dogi是Dog的一个对象,这种方式是通过一个类的对象的getClass()方法获得的
Class clazz3 = Class.forName("top.liu15.entity.Dog"); 这种方法是Class类调用forName方法,通过一个类的全类名获得
-
使用Class
我们先看一下反射机制中有哪些类:
- java.lang.Class;
- java.lang.reflect.Constructor;
- java.lang.reflect.Field;
- java.lang.reflect.Method;
- java.lang.reflect.Modifier;
前面我们知道了怎么获取Class,接下来就使用java所提供的类来做一些操作
- 获取成员方法Method
- 获取成员变量Field
- 获取构造函数Constructor
下面是完整代码:
import java.lang.reflect.*;
public class Dog{
private String name;
private Integer age;
private String color;
public Dog(){
}
public Dog(String name){
this.name = name;
}
public Dog(String name,Integer age,String color){
this.name = name;
this.age = age;
this.color = color;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
public Integer getAge(){
return this.age;
}
public void setColor(String color){
this.color = color;
}
public String getColor(){
return this.color;
}
public void say(){
System.out.println("大家好我叫:" + name + "\t今年" + age + "岁了");
}
public static void main(String[] args){
try {
Class c = Class.forName("Dog");
//得到一个有参构造器
Constructor<?> con = c.getConstructor(java.lang.String.class,java.lang.Integer.class,java.lang.String.class);
//newInstance可以初始化一个实例
Object o = con.newInstance("旺财",2,"黑色");
//获取方法
Method method = c.getMethod("say");
method.invoke(o);
System.out.println(c == Dog.class);
} catch(Exception e){
e.printStackTrace();
}
}
}
输出结果如下:
获取类中所有成员方法的信息,可以通过以下几步来实现:
1.获取所有方法的数组
Class c = Class.forName("Dog");
// 得到该类所有的方法,不包括父类的
Method[] methods = c.getDeclaredMethods();
// 或者:得到该类所有的public方法,包括父类的
Method[] methods = c.getMethods();
2.遍历数组使用For循环
代码如下,其他属性方法与上面相同只贴main方法中的代码
public static void main(String[] args){
try {
Class c = Class.forName("Dog");
System.out.println("----------此类的方法----------");
Method[] methods = c.getDeclaredMethods();
for(Method m : methods){
System.out.println(m.getName());
}
} catch(Exception e){
e.printStackTrace();
}
}
运行结果如下:
同样,如果想要获取所有成员变量的信息,可以通过以下几步
1.获取所有成员变量的数组:
Field[] fields = c.getDeclaredFields();
2.遍历数组
代码如下:
public static void main(String[] args){
try {
Class c = Class.forName("Dog");
System.out.println("----------此类的属性----------");
Field[] fields = c.getDeclaredFields();
for(Field f : fields){
System.out.println(f.getName());
}
} catch(Exception e){
e.printStackTrace();
}
}
运行结果如下:
由于时间关系java的反射机制就只能简单的介绍到这里了,希望能帮助大家,由于是新机器,还没有装IDE,用了原始的方式来执行java代码,望大家谅解!