反射讲解及实际应用

1.什么是反射

通过反射机制,可以了解任意一个对象所属类的成员变量和方法,也可以调用变量和方法,取得全部结构,实现全部接口,等

2.获取类的名称

举个简单的例子,如果现在有一个类,现在通过这个类创建对象,要想通过这个对象获取到类的名称,则需要通过反射机制。
代码展示:

package com.gaoji_fanshe;
class x{
    
    
}
public class text {
    
    
	
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
    
    
	Class<?> c1=null;                     //     指定泛型

	
//	方式1:
		try {
    
    
			c1=Class.forName("com.gaoji_fanshe.x");            //  最常用的方式
		} catch (ClassNotFoundException e) {
    
    
			
			e.printStackTrace();
		}
		System.out.println(c1.getName()); 
		
//           方式二:
		x x1=new x();                    //实例化对象x		
		System.out.println(x1.getClass().getName());             //得到对象所在的类
	
//	          方式三:
	
	Class class1=x.class;
	
	System.out.println( class1.getName());
	
	}
}

运行结果:
在这里插入图片描述

我们可以看到获取到了类所在包名和类名,同时有一个方法getClass(),这个方法在哪里定义的呢?
任何一个没有明确声明继承那个父类时,则默认继承Object类。

定义Class类:
Class本身表示一个类的本身,通过Class可以完整地得到一个类中的完整结构,包括类中的方法定义,属性等定义。

3.取得一个类中的属性

1.通过getField()方法可以获取到定义的公共属性(public)
如果是父类中公共的属性也可以获取

2.获取所有的公共属性:
方法:getFields();

package com.gaoji_fanshe;
public class User {
    
    
	private String  id;
	private String name;
	public int age;
}
package com.gaoji_fanshe;

import java.lang.reflect.Field;


public class Text02 {
    
    
	public static void main(String[] args) {
    
    
		Class class1=User.class;             //实例化class
		
		Field[] c1=class1.getFields();        //获得所有公共的属性
		
		for (Field field : c1) {
    
    
			System.out.println(field);
		}
		
		
	}

}

运行结果:

在这里插入图片描述

4.获取当前类所有的属性,getDeclaredFields()方法

在这里插入图片描述

结果:
在这里插入图片描述

5.获取当前类所有的属性,getDeclaredMethods()

获取方法:代码同上,只需改一下类型和方法即可
获取当前类+父类中所有公共的方法:getMethods();
获取当前类中所有的方法:getDeclaredMethods();

6.通过反射操作属性:

newInstance()方法:
可以根据之前传入的完整的“包,类”名称进行实例化对象操作,完全取代了之前使用new的操作方式
注意:
被实例化对象的类中必须存在无参构造方法,如果不存在,则肯定无法被 实例化的。
通过反射操作属性:
在反射操作中也可以使用Method来调用类中的set,和get方法,但是比较麻烦,我们讲解这一种。

package com.gaoji_fanshe;

import java.lang.reflect.Field;
import java.util.Set;

public class Text03 {
    
    
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
    
    
		
		Class c1=User.class;                   //实例化Class对象
		Object obj=c1.newInstance();     // 实例化对象
		System.out.println(obj);
		Field field=c1.getDeclaredField("id");
		Field field1=c1.getDeclaredField("name");	           //取得属性
		Field field2=c1.getDeclaredField("age");        
		
		field.setAccessible(true);
		field1.setAccessible(true);                       //获取权限
		field2.setAccessible(true);	
		
		field.set(obj, "01");
		field1.set(obj, "FBM");                         //设置值
		field2.set(obj, 18);
		
		
		System.out.println("id:"+field.get(obj));
		System.out.println("name:"+field1.get(obj));              //获取值
		System.out.println("age:"+field2.get(obj));
		
	}

}

运行结果:

在这里插入图片描述
这是一个比较使用的通过反射来操作属性例子,也可以操作构造方法,赋值调用等。
后期可以通过反射配合上注解获取到属性加上sql语句对数据库的操作,后面博客会写到。

猜你喜欢

转载自blog.csdn.net/qq_14930709/article/details/104593909
今日推荐