面试系列(三):Java反射机制

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<A>  class1 = Class.forName("全限定类名");

  A a = class1.newInstance();

  //调用a的set方法

方法二:构造函数

  Constructor<A> cons[] = class1.getConstructors();//该类的全部构造函数

  A a = (A) cons[0].newInstance();//无参

  a = (A) cons[1].newInstance("value1", "value2");//带参

3)获取父类和接口(单继承多实现)

父类:

  Class<A>  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<A>  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<A>  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<A>  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个点答反射机制,基本上就行了~~

猜你喜欢

转载自raising.iteye.com/blog/2377718
今日推荐