反射

java中获取class对象的方式

java中获取class对象的方式有四种:

Class Student{}
public Class Test1{
public static void main(String[] args) {
//		1.通过类名.class获取calss对象
		Class c1 = Student.class;
//		2.通过对象名.getClass()方法
		Student stu = new Student();
		Class c2 = stu.getClass();
//		3.通过Class类中的forName()  Class.forName():()中参数必须时一个类的全类名的字符串形式
		try {		
			Class c3 = Class.forName("com.hisoft.java.Student");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
//		4.通过类加载器.调用loadClass()方法
		try {
			Class c4 = ClassLoader.getSystemClassLoader().loadClass("com.hisoft.java.Student");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	}

class对象的作用

        Class s=Student.class;
		System.out.println(s.getName());//获得类的名称,包括包名
		System.out.println(s.getSimpleName());//获得类的名称,不包括包名
		Class c=s.getSuperclass();//获得本类的父类的class对象
		Class[]arr=s.getInterfaces();//获得本类所实现的所有接口
		Method[] meth1 = s.getDeclaredMethods();
		//取得所有当前类声明的方法,包括四种访问权限的,但是不包括继承的方法
		Method[] meth2 = s.getMethods();
		//取得所有public的方法,包括继承的,接口中声明的和自己定义的
		Field[] fi1 = s.getDeclaredFields();
		//取得所有当前类自己定义的属性,包括四种访问权限的
		Field[] fi2 = s.getFields();
		//取得所有public的属性,包括继承的,接口中声明的和自己定义的

使用class对象创建类的对象

Object newInstance() 可以实例化对象

         Class c = Class.forName("com.hisoft.java.Student");
		Student stu = (Student)c.newInstance();
		//这里的stu就是Student类的一个具体对象(这里会抛出异常)

反射包

一、通过Class对象获得Field对象及Field类的方法

Field:字段类,可以表示所有的字段。
Field getDeclaredField(String name)
Field getField(String name)
Field[] getDeclaredFields()
Field[] getFields()

        Class c = Student.class;
		Field f = c.getDeclaredField("name");
		//根据括号内的字段名获取本类中声明的相应的字段对象(属性)
	   //字段的对象.getModifiers():返回的是字段的修饰符,该修饰符的值是多个修饰符的和的值(具体见下表)
		System.out.println(f.getModifiers());
		System.out.println(f.getName());//获取字段名
		System.out.println(f.getType());//获取字段类型(如String)
		
		Field f1 = c.getField("name");
		//根据字段名获取用public修饰的字段,包括本类中,父类中以及接口中的public修饰的
		Student stu = (Student)c.newInstance();//实例化
		name.set(stu, "张三");
		//set():可以通过字段对象.set(obj,value)方法给指定对象的字段进行赋值
		System.out.println(name.get(stu));
		//get(stu):可以通过字段对象.get()获取字段所对应对象字段的值
		
		Field gender = c.getDeclaredField("gender");//这里的gender是用private修饰的
       //setAccessible:如果字段的访问控制符为private则不能直接使用set赋值,则可以
       通过调用setAccessible方法,设置该字段可访问	
		gender.setAccessible(true);
		gender.set(stu,"男");
		System.out.println(gender.get(stu));

在这里插入图片描述

二、通过Class对象获得Method对象及Method类的方法

public Method[] getDeclaredMethods()
public Method[] getMethods()
public Method getMethod(String name, Class<?>… parameterTypes)
public Method getDeclaredMethod(String name,Class<?>… parameterTypes)

Class c = Class.forName("com.hisoft.java.Student");
Method m1 = c.getDeclaredMethod("study", int.class,String.class);
//根据方法名以及参数类型获取一个指定的方法对象
		System.out.println(m1.getModifiers());//获取修饰符
		System.out.println(m1.getName());//获取方法名
		System.out.println(m1.getReturnType());//	获取返回值类型
		System.out.println(m1.getParameterCount());//获取方法中的参数列表个数
		Parameter[] array =  m1.getParameters();//获取方法中的参数列表
		for(Parameter p:array) {
			System.out.println(p);
		}
		m1.setAccessible(true);//设置方法的可访问
		Student stu = (Student)c.newInstance();
  //invoke:调用方法,方法对象.invoke(对象,参数列表) 
		m1.invoke(stu, 12,"张三");
		
		Method run = c.getDeclaredMethod("run", int.class,String.class);
		String str = (String) run.invoke(stu,12,"张三");
		System.out.println(str);
三、通过Class对象获得Constructor对象

Constructor<?>[] getConstructors() 取得public的构造函数
Constructor<?>[] getDeclaredConstructors() 取得所有的构造函数
Constructor getConstructor(Class<?>… parameters)
Constructor getDeclaredConstructor(Class<?>… parameters)

Class c = Student.class;
Constructor[] carray = c.getDeclaredConstructors();
Constructor[] carray1 = c.getConstructors();
//getConstructor:根据参数列表获取指定的public修饰的构造方法
Constructor c2 = c.getConstructor(String.class,int.class);		
Constructor c3 = c.getDeclaredConstructor(String.class,int.class,String.class,String.class);
//获取构造方法后可以获取相应的修饰符,构造方法名以及参数个数,类型以及参数列表
        System.out.println(c3.getModifiers());
		System.out.println(c3.getName());
		System.out.println(c3.getParameterCount());
		System.out.println(c3.getParameters());
		System.out.println(c3.getParameterTypes());
		
//		根据构造方法实例化对象
		Student stu = (Student)c3.newInstance("李四",20,"男","河南郑州");
		System.out.println(stu);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值