Java中的反射——Class类对目标类对象构造方法,属性和普通方法获取,调查与使用

本文详细探讨了Java中的反射机制,通过Class类获取目标类(如Student类)的构造方法、属性和普通方法。分析了无declared和declared修饰的获取方式,以及调查这些元素的归属类、修饰符、名称和参数类型等。还介绍了如何使用newInstance、invoke等方法进行对象创建和方法调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一、编写一个目标类(Student类)

二、构造方法的获取,调查与使用

(1)获取

a.无declared修饰

b.declared修饰

(2)调查

a、构造方法的归属类

b、构造方法的修饰符

c、构造方法的名称

d、构造方法的参数类型

(3)使用

三、普通方法的获取,调查与使用

(1)获取

a.无declared修饰

b.declared修饰

(2)调查

a、普通方法的归属类

b、普通方法的修饰符

c、普通方法的名称

d、普通方法的参数类型

e、普通方法的返回值类型

(3)使用

四、属性的获取,调查与使用

(1)获取

a.无declared修饰

b.declared修饰

(2)调查

a、属性的归属类

b、属性的修饰符

c、属性的数据类型或类

d、属性的名称

(3)使用


一、编写一个目标类(Student类)

package Test;

public class Student {	
	
	public String name;
	
	private String id;
	
	public Student() {
		
	}
	
	private Student(String name) {
		this.name = name;
	}
	
	private int doHomework(int b,String str) {
		System.out.println("正在做作业......");
		return b;
	}
	
	public void sleep() {
		System.out.println("正在睡觉......");
	}
}

二、构造方法的获取,调查与使用

(1)获取

a.无declared修饰

getConstrutors()方法返回该Class对象表示类包含的所有public构造方法所对应Constructor对象数组。       

getConstrutor(Class<?>... parameterTypes)方法用于返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象。

package Test;

import java.lang.reflect.Constructor;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Constructor constructor = null;
		try {
			constructor = clazz.getConstructor();// 获取无参构造方法
			System.out.println(constructor.getName());
			
			constructor = clazz.getConstructor(String.class);// 获取有参构造方法
			System.out.println(constructor.getName());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

 运行结果:

由开头的定义的Student类得,有参构造方法为private修饰而getConstrutors()方法只能获取public修饰的方法,所以系统报错

b.declared修饰

getDeclaredConstructors() 方法用于返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。

getDeclaredConstructor(Class<?>... parameterTypes)用于返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。

package Test;

import java.lang.reflect.Constructor;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Constructor constructor = null;
		try {
			constructor = clazz.getDeclaredConstructor();// 获取无参构造方法
			System.out.println(constructor.getName());
			
			constructor = clazz.getDeclaredConstructor(String.class);// 获取有参构造方法
			System.out.println(constructor.getName());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

 

因为declared声明的方法不区分权限,因此两个构造方法都能被获取。 

(2)调查

a、构造方法的归属类

getDeclaringClass()方法用于返回声明Constructor对象对应构造方法的类的Class对象。

package Test;

import java.lang.reflect.Constructor;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Constructor constructor = null;
		try {
			constructor = clazz.getDeclaredConstructor();// 获取无参构造方法
			clazz = constructor.getDeclaringClass();//获取归属类
			System.out.println(clazz.getName());
			
			constructor = clazz.getDeclaredConstructor(String.class);// 获取有参构造方法
			clazz = constructor.getDeclaringClass();//获取归属类
			System.out.println(clazz.getName());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果 :

b、构造方法的修饰符

getModifiers()方法用于以整数形式返回Constructor对象表示的构造函数的修饰符。后期可用toString()方法将其转换为字符串

package Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Constructor constructor = null;
		int result = 0;
		try {
			constructor = clazz.getDeclaredConstructor();// 获取无参构造方法
			result=constructor.getModifiers();//获取修饰符
			System.out.println(Modifier.toString(result));//转换为字符串
			
			constructor = clazz.getDeclaredConstructor(String.class);// 获取有参构造方法
			result=constructor.getModifiers();//获取修饰符
			System.out.println(Modifier.toString(result));
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:

 

c、构造方法的名称

getName()方法用于以字符串形式返回Constructor对象所表示得构造方法的名称。

package Test;

import java.lang.reflect.Constructor;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Constructor constructor = null;
		String str = null;
		try {
			constructor = clazz.getDeclaredConstructor();// 获取无参构造方法
			str=constructor.getName();//获取方法名(即类名)
			System.out.println(str);//转换为字符串
			
			constructor = clazz.getDeclaredConstructor(String.class);// 获取有参构造方法
			str=constructor.getName();
			System.out.println(str);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:

 

d、构造方法的参数类型

getParameterTypes()方法用于返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 。如果构造方法没有参数,则数组长度为0

package Test;

import java.lang.reflect.Constructor;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Constructor constructor = null;
		String str = null;
		try {
			
			constructor = clazz.getDeclaredConstructor(String.class);// 获取有参构造方法
			Class [] clazzs = constructor.getParameterTypes();
			for (Class cla : clazzs) {
				System.out.println(cla.getName());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果(因为无参构造方法返回数组长度为0,所以这里不再演示): 

 

(3)使用(创建对象)

newInstance(Object... initargs)方法:使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。

package Test;

import java.lang.reflect.Constructor;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Constructor constructor = null;
		String str = null;
		try {
			
			constructor = clazz.getDeclaredConstructor(String.class);// 获取有参构造方法
			constructor.setAccessible(true);
			Object obj = constructor.newInstance("jim");//对象上转型
			Student stu = (Student)obj;//对象下转型
			System.out.println(stu.name);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

 运行结果:

三、普通方法的获取,调查与使用

(1)获取

a.无declared修饰

getMethods()方法返回一个该Class对象表示类或接口中所有public方法(含继承的)对应的Method对象数组。

getMethod(String methodName, Class<?>... parameterTypes)方法用于返回与该Class对象表示类或接口中方法名和方法形参类型相匹配的public方法(含继承的)的Method对象。

package Test;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method [] methods = null;
		String str = null;
		try {
			
			 methods = clazz.getMethods();
			 for (Method method : methods) {
				System.out.println(method.getName());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果: 

连继承自Object类的方法也被输出 。

b.declared修饰

package Test;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method [] methods = null;
		String str = null;
		try {
			
			 methods = clazz.getDeclaredMethods();
			 for (Method method : methods) {
				System.out.println(method.getName());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果: 

 

(2)调查

a、普通方法的归属类

getDeclaringClass()方法用于返回声明Method对象表示方法的类或接口的 Class 对象。

package Test;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method [] methods = null;
		String str = null;
		try {
			
			 methods = clazz.getDeclaredMethods();
			 for (Method method : methods) {
				clazz = method.getDeclaringClass();
				System.out.println(clazz.getName());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:

 

b、普通方法的修饰符

getModifiers()方法用于以整数形式返回此Method对象所表示方法的修饰符。应该使用Modifier类中的toString方法对所返回的整数进行解码。

package Test;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method [] methods = null;
		String str = null;
		try {
			
			 methods = clazz.getDeclaredMethods();
			 for (Method method : methods) {
				int mod = method.getModifiers();
				System.out.println(Modifier.toString(mod));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果: 

c、普通方法的名称

getName()方法用于返回方法名。

package Test;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method [] methods = null;
		String str = null;
		try {
			
			 methods = clazz.getDeclaredMethods();
			 for (Method method : methods) {
				String name = method.getName();
				System.out.println(name);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果:

 

d、普通方法的参数类型

getParameterTypes()方法用于返回由Method对象代表方法的形参类型对应Class对象组成的数组。如果方法没有参数,则数组长度为 0

package Test;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method method = null;
		String str = null;
		try {
			
			method = clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
			Class<?>[] name = method.getParameterTypes();
			for (Class<?> class1 : name) {
				System.out.println(class1.getName());
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

e、普通方法的返回值类型

 getReturnType()方法用于返回Method对象所表示的方法的返回值类型所对应的Class对象。

package Test;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method method = null;
		String str = null;
		try {
			
			method = clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
			clazz = method.getReturnType();
			System.out.println(clazz.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

(3)使用

Object invoke(Object obj, Object... args)方法用于调用Method对象指代的方法并返回Object类型结果。obj表示该方法所在类实例,如果方法时静态的则obj可以指定为null; args表示传入该方法的参数,如果方法没有参数,则args数组长度可以为 0 null

package Test;

import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		Method method = null;
		String str = null;
		try {
			Student student = new Student();
			method = clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
			
			method.setAccessible(true);//获得调用权限
			
			Object obj = method.invoke(student, 1,"tom");
			System.out.println(obj);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

四、属性的获取,调查与使用

(1)获取

a.无declared修饰

Field[] getFields()方法用于返回一个该Class对象表示类或接口中所有public属性(含继承的)对应的Field对象数组,。

Field getField(String fieldName)方法用于返回该Class对象表示类或接口中与指定属性名(含继承的)相同的public 属性对应的Field对象。

package Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		String str = null;
		try {
			
			Field [] field = clazz.getFields();
			for (Field field2 : field) {
				System.out.println(field2.getName());
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

b.declared修饰

Field[] getDeclaredFields()方法用于返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组,。

Field getDeclaredField(String fieldName)方法用于返回一个与该Class对象表示类或接口内定义的属性名(不含继承的)相匹配的属性相对应的Field对象。

package Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		String str = null;
		try {
			
			Field [] field = clazz.getDeclaredFields();
			for (Field field2 : field) {
				System.out.println(field2.getName());
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

因为该方法忽略访问权限,所以被private修饰的id属性也能被获得:

 

(2)调查

a、属性的归属类

getDeclaringClass()方法用于返回声明Field对象表示字段的类或接口所对应的Class对象。

package Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		String str = null;
		try {
			
			Field [] field = clazz.getDeclaredFields();
			for (Field field2 : field) {
				clazz = field2.getDeclaringClass();
				System.out.println(clazz.getName());
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

b、属性的修饰符

getModifiers()方法用于以整数形式返回Field对象表示的字段的修饰符。

package Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		String str = null;
		try {
			
			Field [] field = clazz.getDeclaredFields();
			for (Field field2 : field) {
				int mod = field2.getModifiers();
				System.out.println(Modifier.toString(mod));
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

c、属性的数据类型或类

getType()方法用于返回Field对象所表示字段的数据类型所对应的Class对象(推荐)。

package Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		String str = null;
		try {
			
			Field [] field = clazz.getDeclaredFields();
			for (Field field2 : field) {
				clazz = field2.getType();
				System.out.println(clazz.getName());
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

d、属性的名称

getName()方法用于返回Field对象表示字段的名称。

package Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		String str = null;
		try {
			
			Field [] field = clazz.getDeclaredFields();
			for (Field field2 : field) {
				str = field2.getName();
				System.out.println(str);
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

 

(3)使用

set(Object obj, Object value)方法用于为Field对象表示属性设置新值。obj为该属性所在类创建的对象,如果该属性为静态的则课设置为null;value为该属性新值。

package Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Test {

	public static void main(String[] args) {
		// 反射是一种新的操作类中属性,构造方法和普通方法的机制
		Class clazz = null;
		clazz = Student.class;
		String str = null;
		try {
			Student student = new Student();
			Field  field = clazz.getField("name");
			field.set(student, "jim");
			Object obj = field.get(student);
			System.out.println(obj);
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

运行结果:

综上,反射无非这么一句话:

获取一律用get,能否获取看declared,使用需要看对象,能否使用看setAccessible。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值