Artio
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

Java反射
一、定义
Java反射机制是在程序运行状态下,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用这个对象的任意方法和属性;这样动态或者以及动态调用的功能就叫反射。
二、基本运用
获取类对象
forName()方法
如果要使用Class类中的方法获取类对象,就需要使用forName方法,只需要类名称即可。
这种方法并不陌生,在配置JDBC的时候,我们通常使用这种方法。
public class forname {
public static void main(String[] args) throws ClassNotFoundException{
Class name = Class.forName("java.lang.Runtime");
System.out.println(name);
}
}
```直接获取
任何数据类型都具备静态的属性,因此可以使用.class 直接获取其对应的Class对象,但要明确用到类中的静态成员。
public class direct {
public static void main(String[] args) throws ClassNotFoundException{
Class name = Runtime.class;
System.out.println(name);
}
}
```getClass()方法
我们可以通过Object类中的getClass方法来获取字节码对象,不过这种方法较为繁琐,必须先要明确具体的类,然后创建对象a,然后a.getClass()获取。
public class getClass {
public static void main(String[] args) throws ClassNotFoundException{
Runtime rt = Runtime.getRuntime();
Class name = rt.getClass();
System.out.println(name);
}
}
```getSystemClassLoader().loadClass方法
该方法与forName方法类似,只要有类名称即可,但是与forName方法有些区别:
forName的静态方法JVM会装载类,并且执行static()中的代码;
getSystemClassLoader().loadClass()不会执行static()中的代码;
比如前边提到的JDBC就是利用forName方法,使JVM查找并加载制定的类到内存,此时将"com.mysql.jdbc.Driver"当作参数传入,就是告知JVM去"com.mysql.jdbc"路径下查找Driver类,并将其加载到内存中。
public class getSystemClassLoader_loadClass {
public static void main(String[] args) throws ClassNotFoundException{
Class<?> name = ClassLoader.getSystemClassLoader().loadClass("java.lang.Runtime");
System.out.println(name);
}
}
```获取类方法
getDeclaredMethods方法
该方法返回类或接口声明的所有方法,包括public、protected、private和默认方法,但不包括继承的方法。
import java.lang.reflect.Method;
public class getDeclaredMethods {
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);
}
}
```
* getMethods方法
* 该方法返回某个类的所有public方法,包括其继承类的public方法。
*
``` java
import java.lang.reflect.Method;
public class getMethods {
public static void main(String[] args) throws ClassNotFoundException{
Runtime rt = Runtime.getRuntime();
Class<?> name = rt.getClass();
Method[] methods = name.getMethods();
System.out.println("通过getMethods方式获取的方法:");
for (Method m:methods)
System.out.println(m);
}
}
```
* getMethod方法
* 该方法只能返回一个特定的方法,如Runtime类中的exec方法,该方法的第一个参数为方法名称,后边的参数为方法的参数对应Class的对象。
*
``` java
import java.lang.reflect.Method;
public class getMethod {
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("通过getMethod方式获取的方法:");
System.out.println(method);
}
}
```
* getDeclaredMethod方法
* 该方法与getMethod方法类似,也只能返回一个特定的方法,该方法的第一个参数为方法名,第二个是方法参数。
*
``` java
import java.lang.reflect.Method;
public class getDeclaredMethod {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException{
Runtime rt = Runtime.getRuntime();
Class<?> name = rt.getClass();
Method method = name.getDeclaredMethod("exec", String.class);
System.out.println("通过getDeclaredMethod方式获取的方法:");
System.out.println(method);
}
}
```
获取类成员变量
getDeclaredFields方法
该方法可以获得类的成员变量数组,包括public、private和proteced,但是不包括父类的申明字段。
import java.lang.reflect.Field;
public class getDeclaredFields {
public static void main(String[] args) throws ClassNotFoundException{
Student student = new Student();
Class<?> name = student.getClass();
Field[] getDeclaredFields = name.getDeclaredFields();
System.out.println("通过getDeclaredFields方式获取的方法:");
for (Field f:getDeclaredFields)
System.out.println(f);
}
}
```
* getFields方法
* 该方法能够获得某个类的所有public字段,包括父类中的字段。
*
``` java
import java.lang.reflect.Field;
public class getFields {
public static void main(String[] args) throws ClassNotFoundException{
Student student = new Student();
Class<?> name = student.getClass();
Field[] getFields = name.getFields();
System.out.println("通过getFields方式获取的字段:");
for (Field f:getFields)
System.out.println(f);
}
}
```
* getDeclaredField方法
* 该方法与getDeclaredFields的区别是只能获取类的单个成员变量
*
``` java
import java.lang.reflect.Field;
public class getDeclaredField {
public static void main(String[] args) throws ClassNotFoundException,NoSuchFieldException{
Student student = new Student();
Class<?> name = student.getClass();
Field getDeclaredField = name.getDeclaredField("name");
System.out.println("通过getDeclaredField方式获取方法:");
System.out.println(getDeclaredField);
}
}
```
* getField方法
* 与getFields方法类似,该方法能够获得某个类特定的public字段,包括父类中的字段
*
``` java
import java.lang.reflect.Field;
public class getField {
public static void main(String[] args) throws ClassNotFoundException,NoSuchFieldException{
Student student = new Student();
Class<?> name = student.getClass();
Field getField = name.getField("content");
System.out.println("通过getField方式获取方法:");
System.out.println(getField);
}
}
```
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)