Java反射

工作几年,近期的项目重新使用Java做开发。虽然之前使用Java做过几个系统开发,但是对一些更基础的概念掌握很是模糊。趁着最近项目比较空闲,利用一些时间复习一下Java的基础用法。 Java反射是很多Java框架的基础,通过反射,可以在运行状态获取类的元数据信息,以及执行对象的方法。

  • 获取类对象

    Class myObjectClass = MyObject.class
     Class class = Class.forName(className);
  • 获取类的名称

    Class aClass = ... //obtain Class object. 
     String className = aClass.getName();
    
     Class  aClass          = ... //obtain Class object. 
     String simpleClassName = aClass.getSimpleName();
  • 获取限定词

    Class  aClass = ... //obtain Class object. 
     int modifiers = aClass.getModifiers();
     Modifier.isAbstract(int modifiers)
     Modifier.isFinal(int modifiers)
     Modifier.isInterface(int modifiers)
     Modifier.isNative(int modifiers)
     Modifier.isPrivate(int modifiers)
     Modifier.isProtected(int modifiers)
     Modifier.isPublic(int modifiers)
     Modifier.isStatic(int modifiers)
     Modifier.isStrict(int modifiers)
     Modifier.isSynchronized(int modifiers)
     Modifier.isTransient(int modifiers)
     Modifier.isVolatile(int modifiers)
  • 获取包的信息

    Class  aClass = ... //obtain Class object.
     Package package = aClass.getPackage();
  • 获取父类

    Class superclass = aClass.getSuperclass();
  • 获取实现的接口

    Class  aClass = ... //obtain Class object. 
     Class[] interfaces = aClass.getInterfaces();
  • 获取构造器

    Constructor[] constructors = aClass.getConstructors();
  • 获取方法

    Method[] method = aClass.getMethods();
  • 获取字段

    Field[] method = aClass.getFields();
  • 获取注解

    Annotation[] annotations = aClass.getAnnotations();

如下是一段代码实例:

package com.riwcwt.common;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectionTest
{

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException, InstantiationException
	{
		System.out.println("1.从对象获取类的名称");
		Printer printer = new Printer();
		System.out.println(printer.getClass().getName());

		System.out.println("2.动态调用对象的方法");
		Method print = printer.getClass().getMethod("print", new Class<?>[0]);
		print.invoke(printer);

		print = printer.getClass().getMethod("print", new Class<?>[] { String.class });
		print.invoke(printer, new String("an empty message"));

		System.out.println("3.根据类的实例创建对象");
		Class<?> c = Class.forName("com.riwcwt.common.Printer");
		Printer anotherPrinter = (Printer) c.newInstance();
		anotherPrinter.print();

		anotherPrinter = Printer.class.newInstance();
		anotherPrinter.print();

		System.out.println("4.获取类的构造器,创建对象");
		c = Printer.class;
		Constructor<?> constructor = c.getConstructor(new Class<?>[] { String.class });
		anotherPrinter = (Printer) constructor.newInstance("构造器传入的消息");
		anotherPrinter.pringMessage();
	}
}

class Printer
{
	private String message = null;

	public Printer()
	{
	}

	public Printer(String message)
	{
		this.message = message;
	}

	public void pringMessage()
	{
		System.out.println(this.message);
	}

	public void print()
	{
		System.out.println("print to the console");
	}

	public void print(String message)
	{
		System.out.println(message);
	}
}

运行结果:

1.从对象获取类的名称
com.riwcwt.common.Printer
2.动态调用对象的方法
print to the console
an empty message
3.根据类的实例创建对象
print to the console
print to the console
4.获取类的构造器,创建对象
构造器传入的消息

你可能感兴趣的:(Java反射)