前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JAVA中的反射笔记

JAVA中的反射笔记

原创
作者头像
帅的一麻皮
修改2020-03-02 07:28:15
7251
修改2020-03-02 07:28:15
举报
文章被收录于专栏:前端与Java学习前端与Java学习

反射概念:

可以动态的获取指定的类以及动态的调用类中的内容。

应用场景:在没有类之前就将创建对象的动作做完了,这就是我们动态获取指定类并且使用类中的内容,这就是反射的应用场景,这样就提高了程序的扩展性。

反射机制的作用

1.完成反编译:.class–>.java 2.通过反射机制访问java类的属性,普通方法,构造方法等。

代码演示:

先创建一个person类添加有参和无参构造方法

注意:

  • 通常被反射的对象一定要提供对应的构造方法 否则会抛出InstantiationException初始化异常
  • 如果提供了构造方法但是权限不够就会抛出异常IllegalAccessException无效访问异常
代码语言:javascript
复制
public class Person {
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	
	}
	public Person() {
		super();
		System.out.println("空参构造方法");
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}	
}

获取Class对象的三种方法:

代码语言:java
复制
public class GetClass {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		getClass1();
		getClass2();
		getClass3();
	}
	//1.通过getClass()
	//弊端:虽然所有对象都可以使用,但是前提是必须要指定类,并且对类进行创建,才可以调用getClass();
	public static void getClass1(){
		Person p1 = new Person();
		Class c = p1.getClass();
		System.out.println(c.getName());
	}
	//2.使用任意数据类型的静态成员class 所有的数据类型都具备的一个属性
	//不需要new对象,但是还是需要具体的类
	public static void getClass2(){
		Class c= Person.class;
		System.out.println(c.getName());	
	}
	//3.使用Class类中的forName()通过给定的类名来获取对应的字解码文件对象
	public static void getClass3() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		//通过给定的类名称,加载对应的字节码文件,并且封装成字节码文件对象Class
		String className="com.tz.entity.Person";//全名称的类名
		Class c = Class.forName(className);
		System.out.println(c.getName());
		//获取了Class对象之后,就可以通过newInstance创建给定类的实例
		Object obj = c.newInstance();//调用无参构造方法
		System.out.println(obj);//打印输出com.tz.entity.Person@15db9742
	}
}

用反射机制通过给定的构造方法去创建对象

代码语言:javascript
复制
public class GetConstructor {

	public static void main(String[] args) throws Exception {	
		getConstructor();
	}
	/*
	思路:
	1.现获取字节码文件对象
	2.再获取给定的构造方法
	3.通过这个给定的构造方法初始化对象
	*/
	public static void getConstructor() throws Exception{
		String s = "com.tz.entity.Person";
		Class c = Class.forName(s);
		//获取指定的构造方  获取Person类中带有两个参数的构造方法
		Constructor cons =c.getConstructor(String.class,int.class);
		//有了构造方法之后,通过构造器对象来初始化该类对象
		Object object = cons.newInstance("小明",28);
		System.out.println(object.toString());//打印Person [name=小明, age=28]
	}
}

反射机制中主要掌握的类型:

以下是SUN提供的反射机制中的类,每个类都可以创建对象。

java.lang.Class;

java.lang.reflect.Constructor;

java.lang.reflect.Field;

java.lang.reflect.Method;

java.lang.reflect.Modifier;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 反射概念:
    • 反射机制的作用
      • 反射机制中主要掌握的类型:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档