java反射的三种方式以及一些常用方法

2021-07-12 00:00:00 反射 常用 三种

1.获取类的三种方式

第一种:使用Class.forName(String classPath) //ClassPath:写需要反射的类名,一般是以包名.类名

注意事项:这里会产生一个ClassNotFoundException异常,我们需要将异常处理或者抛出

返回值:Class对象

try {
      Class clz = Class.forName("com.entity.Book");
  } catch (ClassNotFoundException e) {
      e.printStackTrace();
  }

第二种:直接使用Class clz = 类名.class

这种情况一般在我们知道有这个类的时候去使用

 Class clz = Book.class;

第三种:Class clz = 对象. getClass();

前提是对象已经被实例化出来了

   Book book = new Book();
   Class clz = book.getClass();    

总结:这三种方法都有各自的优点,一般我们使用第一种比较多,按照实际需求去使用才是最好的

2.获取构造函数

getDeclaredConstructors();        //获取所有的构造函数
getDeclaredConstructor(参数类型);   //获取一个所有的构造函数
getConstructors();         //获取所有公开的构造函数
getConstructor(参数类型);      //获取单个公开的构造函数

使用方法:

		//获取所有的构造函数
        Constructor[] constructors = clz.getDeclaredConstructors();
        //获取单个所有的构造函数
        try {
            Constructor constructor =               
            clz.getDeclaredConstructor(String.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        //获取所有的公开构造函数
        Constructor[] constructors1 = clz.getConstructors();
        //获取单个公开构造函数
        try {
            Constructor constructor = clz.getConstructor(String.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }        

获取修饰符
getModifiers();  //获取所有修饰符

返回类型:整数类型,如果有两个修饰符,则返回两个修饰符之和,例如public static void getAll(){ }

返回值会是public和static之和

整数定义:
0–默认不写
1–public
2–private
4–protected
8–static
16–final
32–synchronized
64–volatile
128–transient
256–native
512–interface
1024–abstract

  for (Constructor constructor : constructors) {
        System.out.println(constructor.getModifiers());
   }

获取名字
返回类型:String,可以反射类名,方法名,构造函数名等等
getName();    //获取全名 例如:com.bean.Book
getSimpleName()  //获取类名 例如:Book

   Class clz = Book.class;
   String name1 = clz.getName();
   String name2 = clz.getSimpleName();    

获取包
返回类型:package
getPackage();

  Package aPackage = clz.getPackage();

返回类型:Class[] interfaces
getInterfaces()

  Class[] interfaces = clz.getInterfaces();

获取父类/超类
返回类型:Class superclass
getSuperclass()

  Class superclass = clz.getSuperclass();

获取方法
getMethods()  //获取所有公开的方法
注意:它会将系统自带的方法也得到

   Class clz = Class.forName("Book");
   Method[] methods = clz.getMethods();    //获取所有的公开方法
   for (Method method : methods) {
       System.out.println(method.getName());
   }    

getMethod(String name)  //获取单个公开的方法,参数是可以指定方法名

Method method = clz.getMethod("printAll");        //获取单个的公开方法
method.invoke(clz.newInstance(),null);

getDeclaredMethods()   //获取所有的方法
注意:它不会获取系统自带的方法

Method[] methods1 = clz.getDeclaredMethods();    //获取所有方法
for (Method method1 : methods1) {
     System.out.println(method1.getName());
}    

getDeclaredMethod(String name)    //获取单个的所有方法 参数是可指定方法名

Method method1 = clz.getDeclaredMethod("printOne");    //获取单个所有的方法
System.out.println(method1.getName());

获取字段
公开(Public)
getFields()   //获取所有的公开字段
getField(String name)  //参数可以指定字段  获取单个public字段
getDeclaredFields()  //获取所有的字段
getDeclaredField(String name)  //获取单个字段 参数可以指定字段

 Class clz = Book.class;
 //Public
 Field[] fields = clz.getFields();   //所有公开字段
 Field id = clz.getField("age"); //age字段
 //所有
 Field[] declaredFields = clz.getDeclaredFields();   //所有字段
 clz.getDeclaredField("name");   //name字段

实例化对象
 newInstance(Object initargs)

第一种方式

Class clz = Book.class;
Object obj =  clz.newInstance();        //将创建一个无参book对象

第二种方式

Class clz = Book.class;
Constructor constructor = clz.getDeclaredConstructor();   //获得无参构造 
Object obj = constructor.newInstance();    //实例化book对象

设置访问属性

clz.setAccessible(true)  //可访问
clz.setAccessible(false)  //不可访问
 //默认是false
 Field id = clz.getField("age"); //age字段  
 id.setAccessible(true); //设为可访问
 id.setAccessible(false);    //设为不可访问

使用方法
method.invoke(Object obj,Object… args)
obj:如果是实例方法,则放个该方法的类对象给它
obj:静态方法,写null
args:方法的参数值,没有写null,或不写都行

Method method = clz.getMethod("printAll");        //获取单个的公开方法
method.invoke(clz.newInstance(),null);    //使用方法

以上都是常用的方法,不仅仅只有这些!

通过反射访问私有变量:

public class Test{
 
	public static void main(String[] args) throws Exception {
		//获得Dog类的Class对象
		Class<?> classType = Class.forName("Dog");
		//生成对象的实例
		Object obj = classType.newInstance();
		
		//取得dogName属性
		Field dogName = classType.getDeclaredField("dogName");
		//禁止Field的访问控制检查
		dogName.setAccessible(true);
		//将Field的值设为“Xiao Qiang”
		dogName.set(obj, "Xiao Qiang");
		
		//取得say()方法
		Method say = classType.getDeclaredMethod("say", new Class[]{});
		//禁止say方法的访问控制检查
		say.setAccessible(true);
		//调用say方法
		say.invoke(obj, new Object[]{});
	}
 
}
 
 class Dog {
	//私有的属性
	private String dogName = "Wang Cai";
	//私有的方法
	private void say() {
		System.out.println(dogName + ": Wang Wang");
	}
}
    原文作者:捋捋
    原文地址: https://blog.csdn.net/weixin_49686768/article/details/120454649
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章