反射(方法和字段的获取)

Posted zzh-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射(方法和字段的获取)相关的知识,希望对你有一定的参考价值。

Person类

public class Person {
	public String id;
	private String name;
	private Person() {
		System.out.println("私有的无参的构造方法");
		// TODO Auto-generated constructor stub
	}
	public Person(String name){
		System.out.println("有参的构造方法");		
		this.name = name;		
	}
	public void show(){
		System.out.println("公有的无参的show方法");
	}
	public void show(String name){
		System.out.println("公有的有参的show方法");
	}
	
	private  void private_show(){
		System.out.println("私有的无参的show方法");
	}
	public void private_show(String name){
		System.out.println("私有的有参的show方法");
	}
	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;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + "]";
	}
	
}
 

  

 

测试类

public class Test {

	public static void main(String[] args) throws Exception {
		
		Class clazz = Class.forName("fanshefangfa.Person");
		
		//1.获取所有的public 构造方法(包括父类的)
		System.out.println("获取所有的public 构造方法");
		Constructor[] constructors = clazz.getConstructors();
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}
		//2. 获取所有的构造方法(
		System.out.println("获取所有的构造方法(+私有的)");
		Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
		for (Constructor constructor : declaredConstructors) {
			System.out.println(constructor);
		}
		//3.获取所有的方法(公共的包括父类的)
		System.out.println("获取所有的方法(公共的)");
		Method[] methods = clazz.getMethods();
		for (Method method : methods) {
			System.out.println(method);
		}
		// 4. 获取所有的方法(本类的所有方法)
		System.out.println("获取所有的方法");
		Method[] declaredMethods = clazz.getDeclaredMethods();
		for (Method method : declaredMethods) {
			System.out.println(method);
		}
		//5. 获取某个构造方法,创建对象
		Constructor constructor = clazz.getConstructor(String.class);
		Person person = (Person) constructor.newInstance("小明");
		//6.获取某个公共的普通方法
		Method m1 = clazz.getMethod("show", null);
		m1.invoke(person,null);
		//7.获取某个有参的公共的普通方法
		Method m2 = clazz.getMethod("show", String.class);
		m2.invoke(person, "1");
		//8.获取某个私有的,无参的普通方法
		Method m3 = clazz.getDeclaredMethod("private_show",null);
		m3.setAccessible(true);
		m3.invoke(person, null);
		//9. 获取某个私有的,有参的普通方法
		Method m4 = clazz.getDeclaredMethod("private_show",String.class);
		m4.setAccessible(true);
		m4.invoke(person, "x");
		
		//10. 获取所有的公有的字段
		System.out.println("获取所有的字段:(公有的)");
		Field[] fields = clazz.getFields();
		for (Field field : fields) {
			System.out.println(field);
		}
		//11. 获取所有的字段
		System.out.println("获取所有的字段:(所有的)");
		Field[] declaredFields = clazz.getDeclaredFields();
		for (Field field : declaredFields) {
			System.out.println(field);
		}
		//12 .修改某个字段(公有的)
		Field field = clazz.getField("id");		
		field.set(person, "老王");
		System.out.println(person);
        
		//13 .修改某个字段(私有有的)
		Field field2 = clazz.getDeclaredField("name");
		field2.setAccessible(true);
		field2.set(person, "小王");
		System.out.println(person);
	}
}

  

 

 输出

 
 
获取所有的public 构造方法
public fanshefangfa.Person(java.lang.String)
获取所有的构造方法(+私有的)
private fanshefangfa.Person()
public fanshefangfa.Person(java.lang.String)
获取所有的方法(公共的)
public java.lang.String fanshefangfa.Person.toString()
public java.lang.String fanshefangfa.Person.getName()
public java.lang.String fanshefangfa.Person.getId()
public void fanshefangfa.Person.setName(java.lang.String)
public void fanshefangfa.Person.show(java.lang.String)
public void fanshefangfa.Person.show()
public void fanshefangfa.Person.private_show(java.lang.String)
public void fanshefangfa.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 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 fanshefangfa.Person.toString()
public java.lang.String fanshefangfa.Person.getName()
public java.lang.String fanshefangfa.Person.getId()
public void fanshefangfa.Person.setName(java.lang.String)
public void fanshefangfa.Person.show(java.lang.String)
public void fanshefangfa.Person.show()
public void fanshefangfa.Person.private_show(java.lang.String)
private void fanshefangfa.Person.private_show()
public void fanshefangfa.Person.setId(java.lang.String)
有参的构造方法
公有的无参的show方法
公有的有参的show方法
私有的无参的show方法
私有的有参的show方法
获取所有的字段:(公有的)
public java.lang.String fanshefangfa.Person.id
获取所有的字段:(所有的)
public java.lang.String fanshefangfa.Person.id
private java.lang.String fanshefangfa.Person.name
Person [id=老王, name=小明]
Person [id=老王, name=小王]

  

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">









以上是关于反射(方法和字段的获取)的主要内容,如果未能解决你的问题,请参考以下文章

java反射获取属性值

反射(方法和字段的获取)

027.2 反射技术 动态获取字段和方法

Lua - 反射 - 获取对象上的函数/字段列表?

通过反射获取字段信息

Java-Reflection反射-获取包括父类在内的所有字段