反射

一、反射概念

  • 反射就是将Java类中的成员变量、构造方法、方法,映射出一个一个的Java对象,获取这些对象并进行一些操作。
  • 作用:反射是用来做框架的

二、Class类

1、简述
  • Class类是Java反射机制的入口,封装了一个类或接口的运行时的信息,通过调用Class类的方法获取这些信息。
  • 真正执行的是编译后的.class文件,java认为编译后的class文件是一种对象,这个类就是Class。
  • Class类的特点:
2、Class类实例化对象
  • 通过Class类静态 forName(“类包名.类名”) 获取Class类实例
Class c = null;
try {
	c = Class.forName("反射.Student");
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}
System.out.println("类名为:"+c.getName());
  • 通过类名.class获取Class类实例
	public static void test2() {
		Class c = Student.class;
		System.out.println("类名为:"+c.getName());
	}
  • 基本数据类型通过包装类.TYPE获取Class类实例,或基本数据类型.class获取
	public static void test3() {
		Class c = Integer.TYPE;
		Class c1 = int.class;
		System.out.println("c类名为:"+c.getName());
		System.out.println("c1类名为:"+c1.getName());
	}
  • 创建引用类型的对象,调用对象的getClass()方法获取Class实例
	public static void test4() {
		Student s = new Student();
		Class c = s.getClass();
		System.out.println("类名为:"+c.getName());
		
	}
  • 通过元素类型[].class可以获取数组对应的Class类实例
	public static void test5() {
		Class c = String[].class;
		System.out.println("类名为:"+c.getName());
	}
  • 通过调用某个类的Class实例getSuperClass() 方法可以获取该类超类的Class实例
	public static void test6() {
		Class c = Student.class.getSuperclass();
		System.out.println("Student类的父类为:"+c.getName());
	}

三、构造方法

Constructor getConstrutor(Class<?>… parameterTypes)

返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象

	/*
	* 获取无参构造方法
	*/
	public static void test1() {
		//得到字节码文件
		Class c = Class.forName("反射.Student");//代表Student类在内存中字节码对象
		//得到Student类的构造方法,从而进行创建对象
		Constructor con = c.getConstructor(null);
		con.newInstance(null);
	}
	/*
	* 获取有参构造方法
	*/
	public static void test2() throws ClassNotFoundException {
		Class c = Class.forName("反射.Student");//代表Student类在内存中字节码对象
		Constructor con = c.getConstructor(String.class,int.class);
		con.newInstance("张三",20);
	}
getDeclaredConstructor(Class<?>… parameterTypes)

可以获取非public类中构造方法对应的Constructor对象。

setAccessible(boolean flag)

调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。

newInstance(Object… initargs)

使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组

	public static void test3() throws ClassNotFoundException {
		Class c = Class.forName("反射.Student");//代表Student类在内存中字节码对象
		Constructor con = c.getDeclaredConstructor(String.class);
		con.setAccessible(true);
		con.newInstance("hui");
	}
Constructor[] getConstrutors()

返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组

Constructor<?>[] getDeclaredConstructors()

返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。

public static void test4() throws ClassNotFoundException {
		Class c = Class.forName("反射.Student");
		Constructor[] cs = c.getDeclaredConstructors();
		for(Constructor con:cs) {
			System.out.println(con);
		}
}

结果:

private 反射.Student(java.lang.String)
public 反射.Student(java.lang.String,int)
public 反射.Student()

四、成员变量

1、获取成员变量

在这里插入图片描述

	public static void test1() throws ClassNotFoundException, NoSuchFieldException, SecurityException {
		Class c = Class.forName("反射.Student");
		
		Field[] fields = c.getFields();
		for(Field f:fields) {
			System.out.println(f);
		}
		
		Field[] fields2 = c.getDeclaredFields();
		for(Field f:fields2) {
			System.out.println(f);
		}
		System.out.println(c.getDeclaredField("age"));
	}

结果:

public double 反射.Student.score
private java.lang.String 反射.Student.name
private int 反射.Student.age
public double 反射.Student.score
private int 反射.Student.age

2、对单个成员变量进行操作

在这里插入图片描述

	public static void test() throws ClassNotFoundException, NoSuchFieldException, SecurityException {
		Class c = Class.forName("反射.Student");
		
		Field f = c.getDeclaredField("age");
		
		System.out.println(f.getDeclaringClass());
		System.out.println(f.getModifiers());
		System.out.println(f.getType());
		System.out.println(f.getGenericType());
		System.out.println(f.getName());
	}

结果:

class 反射.Student
2
int
int
age
3、获取及设置成员变量的值

在这里插入图片描述

	public static void test()  {
		Class c = Class.forName("反射.Student");
		Student stu = (Student)c.newInstance();
		Field f = c.getDeclaredField("name");
		f.setAccessible(true);
		f.set(stu, "李四");
		String s = (String)f.get(stu);
		System.out.println(s);
	}	

五、普通方法

在这里插入图片描述

	public static void test1() {
		Class c = Class.forName("反射.Student");
		Method[] ms = c.getMethods();
		for(Method m : ms) {
			System.out.println(m);
		}
		
		Method m = c.getMethod("setName", String.class);
		System.out.println("\n"+m);
	}

结果:

public java.lang.String 反射.Student.toString()
public java.lang.String 反射.Student.getName()
public void 反射.Student.setName(java.lang.String)
public void 反射.Student.setAge(int)
public int 反射.Student.getAge()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

public void 反射.Student.setName(java.lang.String)

在这里插入图片描述

public static void test2() {
		Class c = Class.forName("反射.Student");
		//获取setName方法对应的Method对象
		Method m = c.getMethod("setName", String.class);
		Student stu = (Student)c.newInstance();//创建对象
		Object result = m.invoke(stu, "小明");
		System.out.println(result);
	}

结果:

Student无参构造方法!
小明
null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值