Java的反射机制也会是面试中较常问到的点。建议可以从基本定义,语法和实际应用3方面作答。
1、基本定义
反射机制是在运行状态中,
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2、基本语法
1)获取Class对象
一般有3种形式:
Class> class1 = Class.forName("全限定类名");
Class> class2 = new TestReflect().getClass();
Class> class3 = TestReflect.class;
System.out.println("类名称 " + class1.getName());//将打印出全限定类名(包名.类名)
2)实例化一个类的对象
方法一:newInstance
Class class1 = Class.forName("全限定类名");
A a = class1.newInstance();
//调用a的set方法
方法二:构造函数
Constructor cons[] = class1.getConstructors();//该类的全部构造函数
A a = (A) cons[0].newInstance();//无参
a = (A) cons[1].newInstance("value1", "value2");//带参
3)获取父类和接口(单继承多实现)
父类:
Class clazz = Class.forName("全限定类名");
Class> parentClass = clazz.getSuperclass();
System.out.println("clazz的父类为:" + parentClass.getName());
接口:
Class> intes[] = clazz.getInterfaces();//该类所有接口
for (int i = 0; i < intes.length; i++) {
System.out.println((i + 1) + ":" + intes[i].getName());
}
4)获取一个类全部属性:
Class clazz = Class.forName("全限定类名");
Field[] field = clazz.getDeclaredFields();
for (int i = 0; i < field.length; i++) {
// 权限修饰符
int mo = field[i].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class> type = field[i].getType();
System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";");
}
5)获取一个类全部方法:
Class clazz = Class.forName("全限定类名");
Method method[] = clazz.getMethods();
for (int i = 0; i < method.length; ++i) {
Class> returnType = method[i].getReturnType();//返回值类型
Class> para[] = method[i].getParameterTypes();//参数类型
String Modify = Modifier.toString(method[i].getModifiers());//修饰符
}
6)调用某个类的方法
Class clazz = Class.forName("全限定类名");
Method method = clazz.getMethod("方法名", {参数类型1.class,参数类型2.class,……});
method.invoke(clazz.newInstance(), {参数值1,参数值2,……});
3、反射机制的应用举例:结合工厂模式
interface Animal { public abstract void eatFood(); } class Monkey implements Animal { @Override public void eatFood() { System.out.println("monkey eat peach ..."); } } class Panda implements Animal { @Override 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 static void main(String[] args) { Animal animal = Factory.getInstance("com.nineclient.Panda"); if(animal != null) { animal.eatFood(); } }
运行结果:
Panda eat bamboo ...
从以上3个点答反射机制,基本上就行了~~