Class中的方法
MethodName | 作用 |
---|---|
getName() | 获得类的完整路径 |
getDeclaredFields() | 获得类的所有属性(包括私有成员变量) |
getDeclaredMethods() | 获得类的所有方法 |
getConstructors() | 得到构造函数 |
newInstance() | 获得对象 |
getClassLoader() | 获得其类加载器 |
示例代码
class Test{
private String Testname ;
public Test() {
System.out.println("Test 空构造方法");
}
public Test(String name)
{
this.Testname = name;
System.out.println("Test name参数构造方法");
}
public String getTestname() {
return Testname;
}
public void setTestname(String testname) {
Testname = testname;
}
public void fun1()
{
System.out.println("fun1 函数");
}
}
先通过
Class cla = Test.class;
获得Class对象。
getName()
String name = cla.getName();
System.out.println(name);
结果Test
getDeclaredFields()
Field[] declaredFields = cla.getDeclaredFields();
for (Field field : declaredFields) {
System.out.println(field.getName()); //获得成员变量名,并打印
}
结果Testname
Field类
常用方法有
MethodName | 作用 |
---|---|
get(Object obj) | 返回指定对象上此 Field 表示的字段的值。 |
getType() | 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。 |
getName() | 返回此 Field 对象表示的字段的名称。 |
set(Object obj, Object value) | 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 |
setAccessible(boolean a) | 设置可见性,当设置为true的时候可以访问修改私有属性 |
实例
//获得Testname字段的Filed对象
Field field= cla.getDeclaredField("Testname");
//获得其类型
Class Type = field.getType();
//获得其类型名字
String typeName = Type.getName();
//打印类型名
System.out.println("Testname type: "+typeName);
//设置可见性
field.setAccessible(true);
//新建对象
Test a = new Test("myname");
//获得a对象的Testname字段的值
String name = (String) field.get(a);
//打印
System.out.println("通过反射取到的Testname: "+name);
System.out.println("通过成员方法get到的Testname: "+a.getTestname());
//修改名称
field.set(a, "newname");
System.out.println("修改后通过成员方法get到的Testname: "+a.getTestname());
结果
Testname type: java.lang.String
Test name有参构造方法
通过反射取到的Testname: myname
通过成员方法get到的Testname: myname
修改后通过成员方法get到的Testname: newname
getDeclaredMethods()
//获得全部方法
Method[] declaredMethods = cla.getDeclaredMethods();
for (Method method : declaredMethods) {
//获得方法名
String methodname = method.getName();
System.out.println(methodname);
}
结果
fun1
setTestname
getTestname
Method类
MethodName | 作用 |
---|---|
getName() | 返回方法名称 |
getTypeParameters() | 获得参数的Class数组 |
getReturnType() | 获得返回值的Class |
getModifiers() | 以整数形式返回此Method对象所表示方法的 Java 语言修饰符(表见下表) |
invoke(Object obj, Object… args) | 调用方法 |
修饰符 | 数字 | 二进制 |
---|---|---|
public | 1 | 0000 0000 0001 |
private | 2 | 0000 0000 0010 |
protected | 4 | 0000 0000 0100 |
static | 8 | 0000 0000 1000 |
final | 16 | 0000 0001 0000 |
synchronized | 32 | 0000 0010 0000 |
volatile | 64 | 0000 0100 0000 |
transient | 128 | 0000 1000 0000 |
native | 256 | 0001 0000 0000 |
interface | 512 | 0010 0000 0000 |
abstract | 1024 | 0100 0000 0000 |
strict | 2048 | 1000 0000 0000 |
实例
//获得全部方法
Method[] declaredMethods = cla.getDeclaredMethods();
for (Method method : declaredMethods) {
//获得方法名
String methodname = method.getName();
//打印方法名
System.out.println(methodname);
//获得参数列表
Class<?>[] parameterTypes = method.getParameterTypes();
//遍历
System.out.print("参数列表为: ");
for (Class<?> class1 : parameterTypes) {
System.out.print(class1.getName()+" ");
}
//获得返回值
Class<?> returnType = method.getReturnType();
System.out.println("\n返回值为:"+returnType.getName());
//获得方法修饰
int modifiers = method.getModifiers();
System.out.println("方法修饰号为:"+modifiers);
System.out.println("===========================");
}
Test a = new Test("TestDemo");
//先获取getTestname方法 此方法两个参数一个是方法名 一个是参数的Class类
Method getTestname = cla.getDeclaredMethod("getTestname",null);
//通过invoke调用getTestname方法,invoke可以参数为可变参数,因为无参数,则不传入参数
String Testname = (String) getTestname.invoke(a);
System.out.println("通过invoke调用get: "+Testname);
//获取setTestname 因为 参数为String则需要传进去String.class
Method setTestname = cla.getDeclaredMethod("setTestname",String.class);
//通过invoke调用 传入name字符串
setTestname.invoke(a, "myNewName");
//打印名字
System.out.println("通过invoke调用set(myNewName): "+a.getTestname());
结果
fun1
参数列表为:
返回值为:void
方法修饰号为:1
===========================
setTestname
参数列表为: java.lang.String
返回值为:void
方法修饰号为:1
===========================
getTestname
参数列表为:
返回值为:java.lang.String
方法修饰号为:1
===========================
Test name有参构造方法
通过invoke调用get: TestDemo
通过invoke调用set(myNewName): myNewName
getConstructors()
//获得构造函数列表
Constructor[] constructors = cla.getConstructors();
//遍历
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
}
结果
Test
Test
Constructor类
MethodName | 作用 |
---|---|
getName() | 返回构造方法名称 |
getTypeParameters() | 获得参数的Class数组 |
newInstance(Object… initargs) | 调用相应的构造函数构造对象 |
实例
//获得构造函数列表
Constructor[] constructors = cla.getConstructors();
//遍历
for (Constructor constructor : constructors) {
System.out.println("构造方法名:"+constructor.getName());
//获得参数列表
Class<?>[] parameterTypes = constructor.getParameterTypes();
//遍历
System.out.print("参数列表为: ");
for (Class<?> class1 : parameterTypes) {
System.out.print(class1.getName()+" ");
}
System.out.println("\n===========================");
}
//获得无参数构造函数
Constructor noParameterConstructor=cla.getConstructor();
//执行
Test noParameterTest = (Test) noParameterConstructor.newInstance();
//获得有参数的构造方法
Constructor ParameterConstructor=cla.getConstructor(String.class);
//执行
Test ParameterTest = (Test) ParameterConstructor.newInstance("sss");
结果
构造方法名:Test
参数列表为: java.lang.String
===========================
构造方法名:Test
参数列表为:
===========================
Test 空构造方法
Test name有参构造方法
newInstance()
Test newInstance = (Test) cla.newInstance();
结果Test 空构造方法
可以看出此方法只能调用空的构造函数来new对象,所以我们在写有关于反射的框架的时候,都会给每个类放置一个空的构造函数,防止在反射获取对象的时候获取不到。
getClassLoader()
ClassLoader classLoader = cla.getClassLoader();
System.out.println(classLoader);
结果sun.misc.Launcher$AppClassLoader@1a7508a
可以看出它是由AppClassLoader
所进行加载的,所以可以通过此方法查看类是由那个加载器加载的。