java 反射


在java中允许通过类的对象来取得类的信息

对于反射二字的理解:
通过声明对象的类型,来实例化对象,反过来通过实例化的对象来取得Class对象
在这里插入图片描述
Object类中定义了一个getClass(),这个方法返回一个Class类型的返回值
视频中对于反射的定义:
在这里插入图片描述

Class类中的常用方式

在这里插入图片描述

实例化Class对象的三种方式:

第一种 forName()

c1= Class.forName("反射.X");
最主要的使用的方式

第二种 类.class

c3=X.class;

第三种 对象.getClass()

c2=new X().getClass();

Class的使用

使用class类中的newInstance()方法来实例化对象

package 反射;
class Person
{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

public class Demo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Class<?> c1 =null;
		
		try {
		 c1 =Class.forName("反射.Person");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			Person per = (Person) c1.newInstance();
			per.setName("yang");
			System.out.println(per.getName());
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		

	}

使用以上操作中,类中必须存在无參构造方法,不然无法通过编译
在这里插入图片描述
若类中不存在无參构造方法,则需要指定调用的构造方法,并传递参数,所以在一般的额java反射操作中一般都要有无參构造方法。

package 反射;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

class Person
{
	private String name;
	public Person(String name)
	{
		this.name=name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

public class Demo2 {

	public static void main(String[] args) throws IllegalArgumentException, InvocationTargetException {
		// TODO Auto-generated method stub
		Class<?> c1 =null;
		
		try {
		 c1 =Class.forName("反射.Person");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			Constructor<?> cons[] =null;
		cons=c1.getConstructors();
		
			Person per = (Person)cons[0].newInstance("yang");
			per.setName("yang");
			System.out.println(per.getName());
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		

	}

}

反射的应用

在这里插入图片描述

反射机制的深入

在这里插入图片描述

取得一个类的接口

Class<?> c
Class<?> c1[] = c.getInterfaces();
此方法返回此类所实现的接口数组

取得一个类的父类

class<?> c1 =c.getSuperClass();

取得一个类的所有构造方法

Constructor<?> con[] =c1.getConstructors();
代码例子:
在这里插入图片描述
实现结果:

在这里插入图片描述

取得全部方法

我是分割线---------------------------------
在这里插入图片描述

在这里插入图片描述

实例代码
在这里插入图片描述

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

取得一个类中的全部属性

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

深入理解java反射机制

1,通过反射调用类中的方法

实例
不需要已经生成好的对象,在任意的地方直接调用类中的方法
sayhello是方法名称
调用无參方法
在这里插入图片描述
调用有參方法
在这里插入图片描述

2、通过反射调用类setter和getter (必须掌握)

实例:
在这里插入图片描述
在这里插入图片描述

3、通过反射设置类的flied

比较简单,但需要注意的是访问私有属性的时候,要在外部能够访问则需要使用setAcessiable()方法来设置此属性对外部可见
实例:
在这里插入图片描述
本博客资源来自mldn视频教程,仅用于学习交流,侵删。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值