Java的反射机制
基本定义:
(1)对于任意一个类,都能知道该类的所有属性和方法;
(2)对于任意一个对象,都能调用该对象的任意一个属性和方法。
常用方式:
(1)获取Class对象;
(2)实例化一个对象;
(3)获取一个类的父类或者接口(单继承,多实现);
(4)获取类中的所有属性;
(5)获取类中的所有方法;
(6)调用类中的任意一个方法。
更进一步理解,可参看下面的Java代码:
package reflect_test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
interface Animal
{
public abstract void eatFood();
}
class Monkey implements Animal
{
public void eatFood()
{
System.out.println("monkey eat peach ...");
}
}
class Person extends Monkey implements Animal
{
public int name;
public int age;
public Person(int name,int age)
{
this.name = name;
this.age = age;
}
}
class Panda implements Animal
{
public void eatFood()
{
System.out.println("Panda eat bamboo ...");
}
}
class Factory
{
public static Animal getInstance(String ClassName)
{
Animal animal = null;
try
{
animal = (Animal) Class.forName(ClassName).newInstance();
}
catch (Exception e)
{
e.printStackTrace();
}
return animal;
}
}
public class ReflectTest
{
public static void main(String[] args) throws Exception
{
/*
Java语言的反射机制:
对于任意一个类,都能知道该类的属性和方法;
对于任意一个对象,都能调用该对象的任意一个属性和方法
*/
//=====================================================================================
//1.获取Class对象
Class class1 = Class.forName("reflect_test.Monkey");//参数为该类的全限定名(包名.类名)
System.out.println("类名称 :" + class1.getName());//返回该类的全限定名
Class class2 = new Monkey().getClass();
System.out.println("类名称 :" + class2.getName());//返回该类的全限定名
Class class3 = Monkey.class;
System.out.println("类名称 :" + class3.getName());//返回该类的全限定名
//=====================================================================================
//2.实例化一个类对象
Monkey m1 = (Monkey)class1.newInstance();//newInstance()方法
//构造函数法
Constructor[] cons = class1.getConstructors();
Monkey m2 = (Monkey)cons[0].newInstanc
//=====================================================================================
//3.获取父类或者接口(单继承多实现)
Class class4 = Class.forName("reflect_test.Person");//获取Class对象,参数为全限定类名(包名.类名)
Class superClass = class4.getSuperclass();//获取父类Class对象
System.out.println("父类为:" + superClass.getName());
Class[] in = class4.getInterfaces();
for(int i = 0;i < in.length;i++)
{
System.out.println("实现的接口为:" + in[i].getName());
}
//=====================================================================================
//4.获取一个类的全部属性
Field[] field = class4.getDeclaredFields();
for(int i = 0;i < field.length;i++)
{
//获取属性的权限修饰符
int mo = field[i].getModifiers();
System.out.println(Modifier.toString(mo));
//获取属性的类型
Class type = field[i].getType();
System.out.println("该属性的类型为:" + type.getName() + ",该属性名称为: " + field[i].getName());
}
//=====================================================================================
//5.获取一个类的全部方法
Method[] method = class4.getMethods();
for(int i = 0;i < method.length;i++)
{
//该方法的修饰符
String md = Modifier.toString(method[i].getModifiers());
System.out.println("方法的修饰符" + md);
//该方法函数返回值类型
Class rt = method[i].getReturnType();
System.out.println("函数返回值类型" + rt.getName());
//方法参数
Parameter[] p = method[i].getParameters();
}
//=====================================================================================
//6.调用某个类的方法
Class class5 = Class.forName("reflect_test.Monkey");
Method me = class5.getMethod("eatFood", null);
me.invoke(class5.newInstance(), null);
//=====================================================================================
Animal animal = Factory.getInstance("reflect_test.Panda");
if (animal != null)
{
animal.eatFood();
}
}
}