java反射机制
如何理解反射
反射可以理解为一种手段,对象通过反射可以获取他的类,类可以通过反射获取他的所有方法,通过反射,我们可以将java这种静态语言附加上动态特性。
这种动态获取的信息以及动态调用对象的功能成为java语言的反射机制
如何理解动态特性
⼀段代码,改变其中的变量,将会导致这段代码产⽣功能性的变化
获取类对象的方法
1.forname()方法
通过动态修改forname的参数,可以获取不同的java类
并且其静态方法JVM会装在类,并且执行static()中的代码。
public class reflect_test { |
2.直接获取
任何数据类型都具备静态的属性,因此可以使用.class直接获取其对应的class对象,需要明确用到类中的静态成员
public static void main(String[] args) throws ClassNotFoundException{ |
3.使用getclass()方法
我们可以通过object类中的getclass()方法来获取字节码对象
需要明确具体的类,然后创建对象
public static void main(String[] args) throws ClassNotFoundException{ |
4.使用getSystemClassLoader().loadClass()
1.类似于forName()
但是不会执行static中的代码。
public static void main(String[] args) throws ClassNotFoundException{ |
获取类的方法
1.getDeclaredMethods方法
getDeclaredMethods方法 返回类或接口声明的所有办法,包括public、protected、private、和默认方法,但不包括继承的方法
import java.lang.reflect.Method; |
2.getMethods方法
getMethods方法返回某个类的所有public方法,包括其继承类的public方法
public static void main(String[] args) throws ClassNotFoundException{ |
3.getMethod方法
只能返回一个特定的方法,如Runtime类中的exec方法,该方法的第一个参数为方法名称,后面的参数为方法的参数对应class的对象
public static void main(String[] args) throws ClassNotFoundException,NoSuchMethodException{ |
4.getDeclaredMethod方法
getDeclaredMethod方法和getMethod类似
获取成员变量
1.getDeclaredFields方法
getDeclaredFields能获得类的成员变量数组,包括public、private、protected,但是不包括父类的声明字段
2.getFields方法
getFields能够获得某个类的所有public字段,包括父类中的字段,
3.getDeclaredField方法
只能获得类的单个成员变量
4.getField方法
类似getFields方法,能够获得某个类特定的public字段,包括父类中的字段
Class<?> name=student.getClass() |
小结
forNam
e不是获取“类”的唯⼀途径,通常来说我们有如下三种⽅式获取⼀个“类”,也就是java.lang.Class对象:
obj.getClass()
如果上下⽂中存在某个类的实例obj,那么我们可以直接通过obj.getClass()来获取它的类Test.class
如果你已经加载了某个类,只是想获取到它的java.lang.Class对象,那么就直接拿它的class属性即可。这个⽅法其实不属于反射。Class.forName
如果你知道某个类的名字,想获取到这个类,就可以使⽤forName来获取