JAVA反射

发布于 2019-01-02  244 热度


获取Class的方法:

  • Class<?> cls = Class.forName("Person");//通过类名获取
  • Class<?> cls = person.class;//通过已实例化的对象的class属性获取
  • Class<?> cls = person.getClass();//通过已实例化的对象的getClass()方法获取

获取构造方法:

  • Constructor<?>[] publicCons = cls.getConstructors();//获取所有public 构造方法
  • Constructor<?> con = cls.getConstructor(String.class,String.class);//获取指定public 构造方法
  • Constructor<?>[] allCons = cls.getDeclaredConstructors();//获取所有构造方法

获取成员方法:

  • Method[] publicMethods = cls.getMethods();//获取所有public 成员方法
  • Method method = cls.getMethod("getName");//获取指定public 成员方法
  • Method[] allMethods = cls.getDeclaredMethods();//获取所有成员方法

获取成员变量:

  • Field[] publicFields = cls.getFields();//获取所有public 成员变量
  • Field nameField = cls.getField("name");//获取指定public成员变量
  • Field nameField = cls.getDeclaredField("name");//获取指定成员变量
  • Field[] allFields = cls.getDeclaredFields();//获取所有成员变量

其他:

  • Object obj = con.newInstance("101","王晓");//用构造方法con实例化一个对象obj对象
  • Object name = method.invoke(obj);//执行obj的method方法
  • nameField.setAccessible(visible);//将一个成员变量nameField的可见性设置为visible;
  • nameField.set(obj, value);//将对象obj的nameField变量的值设置为value

实例:


import java.lang.reflect.*;

public class InformationClass {

	public static void main(String[] args) throws Exception {
		Class cls = Class.forName("Person");
		Constructor[] publicCons = cls.getConstructors();
		Constructor con = cls.getConstructor(String.class,String.class);
		Constructor[] allCons = cls.getDeclaredConstructors();
		System.out.println("------------构造方法----------");
		System.out.println("所有公用构造方法:");
		for(Constructor c:publicCons)
			System.out.println(c);
		System.out.println("指定公用构造方法:");
		System.out.println(con);
		System.out.println("所有构造方法:");
		for(Constructor c:allCons)
			System.out.println(c);
		System.out.println("------------方法----------");
		Method[] publicMethods = cls.getMethods();
		Method method = cls.getMethod("getName");
		Method[] allMethods = cls.getDeclaredMethods();
		System.out.println("所有公用方法:");
		for(Method m:publicMethods)
			System.out.println(m);
		System.out.println("指定公用方法:");
		System.out.println(method);
		System.out.println("所有方法:");
		for(Method c:allMethods)
			System.out.println(c);
		System.out.println("------------成员变量----------");
		Field[] publicFields = cls.getFields();
		//Field nameField = cls.getField("name");
		Field nameField = cls.getDeclaredField("name");
		Field[] allFields = cls.getDeclaredFields();
		System.out.println("所有公用成员变量:");
		for(Field m:publicFields)
			System.out.println(m);
		System.out.println("指定成员变量:");
		System.out.println(nameField);
		System.out.println("所有成员变量:");
		for(Field c:allFields)
			System.out.println(c);
		System.out.println("------------调用成员方法----------");
		Object obj = con.newInstance("101","王晓");
		Object name = method.invoke(obj);
		System.out.println("方法的返回值:"+name);
		System.out.println("-----------为成员变量赋值----------");
		nameField.setAccessible(true);
		nameField.set(obj, "王笑笑");
		Object getField = nameField.get(obj);
		System.out.println("get到的成员变量值:"+getField);
		
	}

}
class Person {
	private String id;
	private String name;
	protected Person(String id) {
		this.setId(id);
	}
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Person(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	private void print() {
		
	}
	public Person() {
		super();
	}

}

运行结果:

------------构造方法----------
所有公用构造方法:
public Person(java.lang.String,java.lang.String)
public Person()
指定公用构造方法:
public Person(java.lang.String,java.lang.String)
所有构造方法:
public Person(java.lang.String,java.lang.String)
public Person()
protected Person(java.lang.String)
------------方法----------
所有公用方法:
public java.lang.String Person.getName()
public java.lang.String Person.getId()
public void Person.setName(java.lang.String)
public void Person.setId(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
指定公用方法:
public java.lang.String Person.getName()
所有方法:
public java.lang.String Person.getName()
public java.lang.String Person.getId()
public void Person.setName(java.lang.String)
private void Person.print()
public void Person.setId(java.lang.String)
------------成员变量----------
所有公用成员变量:
指定成员变量:
private java.lang.String Person.name
所有成员变量:
private java.lang.String Person.id
private java.lang.String Person.name
------------调用成员方法----------
方法的返回值:王晓
-----------为成员变量赋值----------
get到的成员变量值:王笑笑


我一直在开辟我的天空