java反射机制

如何理解反射

反射可以理解为一种手段,对象通过反射可以获取他的类,类可以通过反射获取他的所有方法,通过反射,我们可以将java这种静态语言附加上动态特性。

这种动态获取的信息以及动态调用对象的功能成为java语言的反射机制

如何理解动态特性

⼀段代码,改变其中的变量,将会导致这段代码产⽣功能性的变化

获取类对象的方法

1.forname()方法

通过动态修改forname的参数,可以获取不同的java类

并且其静态方法JVM会装在类,并且执行static()中的代码。

public class reflect_test {
public static void main(String[] args) throws ClassNotFoundException{
Class name= Class.forName("xxxx");
System.out.println(name);
}
}

2.直接获取

任何数据类型都具备静态的属性,因此可以使用.class直接获取其对应的class对象,需要明确用到类中的静态成员

public static void main(String[] args) throws ClassNotFoundException{
Class<?> name=Runtime.class;
System.out.println(name);
}

3.使用getclass()方法

我们可以通过object类中的getclass()方法来获取字节码对象
需要明确具体的类,然后创建对象

public static void main(String[] args) throws ClassNotFoundException{
Runtime rt= Runtime.getRuntime();
Class<?> name=rt.getClass();
System.out.println(name);
}

4.使用getSystemClassLoader().loadClass()

1.类似于forName()

但是不会执行static中的代码。

public static void main(String[] args) throws ClassNotFoundException{
Class<?> name=ClassLoader.getSystemClassLoader().loadClass("java.lang.Runtime");
System.out.println(name);
}

获取类的方法

1.getDeclaredMethods方法

getDeclaredMethods方法 返回类或接口声明的所有办法,包括public、protected、private、和默认方法,但不包括继承的方法

import java.lang.reflect.Method;
public class getfunction {
public static void main(String[] args) throws ClassNotFoundException{
Class name= Class.forName("java.lang.Runtime");
Method[] declaredMethods=name.getDeclaredMethods();
System.out.println("通过getDeclaredMethods获取的方法有:");
for(Method m:declaredMethods)
System.out.println(m);
}

2.getMethods方法

getMethods方法返回某个类的所有public方法,包括其继承类的public方法

public static void main(String[] args) throws ClassNotFoundException{
Class name= Class.forName("java.lang.Runtime");
Method[] declaredMethods=name.getMethods();
System.out.println("通过getMethods获取的方法有:");
for(Method m:declaredMethods)
System.out.println(m);
}

3.getMethod方法

只能返回一个特定的方法,如Runtime类中的exec方法,该方法的第一个参数为方法名称,后面的参数为方法的参数对应class的对象

public static void main(String[] args) throws ClassNotFoundException,NoSuchMethodException{
Runtime rt=Runtime.getRuntime();
Class<?> name= rt.getClass();
Method method=name.getMethod("exec",String.class);
System.out.println("通过getMethods获取的方法有:");
System.out.println(method);

}

4.getDeclaredMethod方法

getDeclaredMethod方法和getMethod类似

获取成员变量

1.getDeclaredFields方法

getDeclaredFields能获得类的成员变量数组,包括public、private、protected,但是不包括父类的声明字段

2.getFields方法

getFields能够获得某个类的所有public字段,包括父类中的字段,

3.getDeclaredField方法

只能获得类的单个成员变量

4.getField方法

类似getFields方法,能够获得某个类特定的public字段,包括父类中的字段

Class<?> name=student.getClass()
Field getField=name.getField("content");

小结

forName不是获取“类”的唯⼀途径,通常来说我们有如下三种⽅式获取⼀个“类”,也就是java.lang.Class对象:

obj.getClass() 如果上下⽂中存在某个类的实例obj,那么我们可以直接通过obj.getClass()来获取它的类
Test.class 如果你已经加载了某个类,只是想获取到它的java.lang.Class对象,那么就直接拿它的class属性即可。这个⽅法其实不属于反射。Class.forName 如果你知道某个类的名字,想获取到这个类,就可以使⽤forName来获取

Author

vague huang

Posted on

2022-02-21

Updated on

2022-02-24

Licensed under

Comments