初识Java反射

今天上课一个老师问:一个引用指向一个对象能不能使用这个对象里面的所有公用方法,同学都一一回答可以,结果测试之后都错了。先举个列子吧。

1. 实体类测试类学生

package com.test.entity;

public class Student {
	private String name;
	
	public void Singing(){
		System.out.println("sing a song");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}	
}
2.测试代码:

import com.test.entity.Student;


public class FeflectTest {
	public static void main(String[] args) {
		/*
		 * 用一个object的引用去指向一个学生;
		 * */
		Object s = new Student();
		//s.Singing();
	}
}
结果注释的地方编译就报错,没有此方法。然后就顺势分析问题,那到底s是Object类型还是Student类型呢。初看应该是Object类型,因为s.Singing()报错嘛。然而答案真是这样吗?

在测试代码中运行代码System.out.println(s.getClass().getName());结构输出com.test.entity.Student。所以理解是错误的,其实s是能执行此方法的,只是在编译器无法成功通过编译。那么怎样才能让s执行方法呢?接下来就要讲到Java中的反射了。

一. java反射机制

.class----->.java 是一个编译的逆过程

通过java反射能访问java的方法,属性,接口等等

二.Class 讲解

java世界里,一切皆对象。各个java对象也是对象,是Class。这个其实就是我们.java文件编译后的.class那个东西,通常较字节码,是java反射中的核心。

获取对象的字节码方式如下:

//第一种方式:  
Classc = Class.forName("com.test.entity.Student");  
//第二种方式:  
//java中每个类型都有class 属性.  
Classc1 = Student.class;  
   
//第三种方式:  
//java语言中任何一个java对象都有getClass 方法  
Student= new Student();  
Classc2 = e.getClass();
获取对象的字节码之后就能进行java反射了。

三 通过java反射动态调用方法

java作为先编译后运行的语言,java反射机制能让我们更完全的操作java对象,通过得到的class就能获取对象的属性、方法、构造方法、父类、接口等等。在这里就不赘述了,api讲的非常详细。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.test.entity.Student;


public class FeflectTest {
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		/*
		 * 用一个object的引用去指向一个学生;
		 * */
		Object s = new Student();
		Class cs = s.getClass();//获取学生类的class
		Method Singing = cs.getMethod("Singing", null);//获取方法,第一个参数为方法名,第二个为方法的参数,是个数组
		Singing.invoke(s, null);//对应方法的调用,第一个参数为作用的类对象,第二个为方法传递的参数 output:sing a song
		//s.Singing();
	}
}
通过上述代码就能实现一开的需求,绕过编译器动态调用Singing()方法。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值