反射技术

定义

反射原理:
  • 首先需要把java文件保存到本地硬盘 .java
  • 编译java文件,成.class文件
  • 使用jvm,把class文件通过类加载加载到内存中
  • 当使用反射时候,首先需要获取到Class类,得到了这个类之后,就可以得到class文件里面的所有内容
包含属性 构造方法 普通方法
  • 属性通过一个类 Filed
  • 构造方法通过一个类 Constructor
  • 普通方法通过一个类 Method
  • 得到Class的方法:
    Class clazz1 = Person.class;
    Class clazz2 = new Person().getClass();
    Class clazz3 = Class.forName(“cn.itcast.test09.Person”);
  • 反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。(动态的获取指定的类以及动态的调用类中的内容。)

反射的优缺点

  • 优点:就是可以实现动态创建对象和编译,体现出很大的灵活性

  • 缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

  • 图例 :

  • 获取class对象

  • 通过带参的构造器获取对象

  • 得到类Class之后,便可以得到他所有的属性
    getXXX();该方法获取的都是类中的公用属性和方法;
    getDeclaredXXX():获取所有属性和方法,包括私有方法。

反射实例(笔记本USB)

  • 定义use接口
 public interface USB{
    void open();
    void close();
  }
  • 笔记本实体类
  • 具体的实现类
  • 扩展功能鼠标
  • 使用反射来实现扩展(NoteBookMain)

利用反射操作无参数的构造方法:

public void test() throws Exception {
Class c3 = Class.forName("cn.home.Person");
		Person p = (Person) c3.newInstance();
		p.setName("zhangsan");
		System.out.println(p.getName());
	}		

使用反射操作有参数的构造方法

public void test() throws Exception {
		Class c1 = Class.forName("cn.home.Person");
		//c1.getConstructors();//获取所有的构造方法
		//传递是有参数的构造方法里面参数类型,类型使用class形式传递
		Constructor cs = c1.getConstructor(String.class,String.class);
		Person p1 = (Person) cs.newInstance("lisi","100");
		System.out.println(p1.getId()+" "+p1.getName());
	}

使用反射操作属性

public void test3() {
		try {
			Class c2 = Class.forName("cn.home.Person");
			//c2.getDeclaredFields();//表示得到所有的属性
			Person p11 = (Person) c2.newInstance();
			//通过这个方法得到属性,参数是属性的名称
			Field f1 = c2.getDeclaredField("name");
			//可以操作私有属性m1.setAccessible(true),可以操作私有属性
			f1.setAccessible(true);
			//设置name值 set方法,两个参数:第一个参数类的实例,第二个参数是设置的值
			f1.set(p11, "wangwu"); //相当于 在 p.name = "wangwu";
			System.out.println(f1.get(p11)); //相当于 p.name
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

使用泛型操作普通方法:

public void test4() throws Exception {
		Class c4 = Class.forName("cn.home.Person");
		Person p4 = (Person) c4.newInstance();
		//c4.getDeclaredMethods();//得到所有的普通方法
		//传递两个参数:第一个参数,方法名称;第二个参数,方法里面参数的类型
		Method m1 = c4.getDeclaredMethod("setName", String.class);
		//让setName方法执行 ,执行设置值
		//使用invoke(p4, "niuqi");传递两个参数:第一个参数,person实例;第二个参数,设置的值
		//执行了invoke方法之后,相当于,执行了setName方法,同时通过这个方法设置了一个值是niuqi
		m1.invoke(p4, "niuqi");
		System.out.println(p4.getName());
	}
	
Class类的常用方法

String getName():获取类名称,包含包名;
String getSimpleName():获取类名称,不包含包名;
Class getSupperClass():获取父类的Class,例如:new Integer(100).getClass().getSupperClass()返回的是Class!但new Object().getSupperClass()返回的是null,因为Object没有父类;
T newInstance():使用本类无参构造器来创建本类对象;
boolean isArray():是否为数组类型;
boolean isAnnotation():是否为注解类型;
boolean isAnnotationPresent(Class annotationClass):当前类是否被annotationClass注解了;
boolean isEnum():是否为枚举类型;
boolean isInterface():是否为接口类型;
boolean isPrimitive():是否为基本类型;
boolean isSynthetic():是否为引用类型;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值