java高级-反射一

反射

概念:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

1获取class的Class实例三种方式:

方法一:通过class的静态变量 类名.class

Class cls = String.class;

方法二:通过实例变量 对象.getClass()

String s = "Hello";
Class cls = s.getClass();

方法三如果知道一个class的完整类名,可以通过静态方法 Class.forName() 获取【常用】

Class cls = Class.forName("java.lang.String");

2获取class的构造方法【Constructor类】

getConstructor(Class…<?> parameterTypes)         获得该类中与参数类型匹配的public构造方法
getConstrutors()                                 获得类的所有public类型的构造方法

getDeclaredConstructor(Class…<?> parameterTypes) 获得该类中与参数类型匹配的构造方法
getDeclaredConstructors()                        获取类的所有构造方法

Constructor

3获取class的Field【Field类】

getField(String name)         获得public 的指定属性
getFields()                   获得类所有public类型的属性
getDeclaredField(String name) 获得某个属性对象
getDeclaredFields()           获得类的所有属性

Field


4获取class的Method【Method类】

getMethods()                                    获得类的public类型的方法
getMethod(String name, Class[] parameterTypes)  获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。
getDeclaredMethods()                            获得类的所有方法

Method

这里的Class类型是一个名叫Class的class

public final class Class {
    private Class() {}
}

例子:

1.通过反射获取Class对象的三种方式

public class hu {
	public static void main(String[] arg0) {
		
		//第一种方式
		Student s=new Student();//new出Student对象,一个Class对象
		Class cls=s.getClass();//获取Class对象
		System.out.println(cls.getName());     //Student
		
		//第二种方式
		Class cls2=Student.class;
		System.out.println(cls==cls2);        //true
		
		//第三种方式
		try{
			Class cls3=Class.forName("Student");//包名 类名
			System.out.println(cls==cls3);		//true
		}catch(ClassNotFoundException e){
			e.printStackTrace();
		}	
	}
}

注意:在运行期间,一个类,只有一个Class对象产生
三种方式常用第三种,第一种和第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

2.通过反射获取构造方式

import java.lang.reflect.Constructor;
public class Student {
	
	public Student(){
		System.out.println("公有 无参构造函数");
	}
	public Student(char name){
		System.out.println("name "+name);
	}
	public Student(String _name,int _age){
		System.out.println("name age"+_name+" "+_age);
	}
	protected Student(boolean n){
		System.out.println("受保护的构造函数");
	}
	private Student(int _age){
		System.out.println("私有构造方法"+age);
	}
}
----------------------------------------------------------------
	public static void main(String[] arg0) {
		try{
			//加载Class对象
			Class cls=Class.forName("Student");
			//1获取所有公有构造方法
			System.out.println("获取所有公有构造方法");
			Constructor[] conArray=cls.getConstructors();
			for(Constructor c:conArray){
				System.out.println(c);
			}
			//2获取所有的构造函数
			System.out.println("获取所有的构造方法");
			conArray=cls.getDeclaredConstructors();
			for(Constructor c:conArray){
				System.out.println(c);
			}		
		}catch(ClassNotFoundException e){
			e.printStackTrace();
		}	
	}

调用方法:
获取构造方法

1)批量的方法:
public Constructor[] getConstructors():所有"公有的"构造方法
public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

2)获取单个的方法,并调用:
public Constructor getConstructor(Class… parameterTypes):获取单个的"公有的"构造方法:
public Constructor getDeclaredConstructor(Class… parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

3.获取成员变量并调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值