初识Java反射

2017-01-13 15:03:18来源:csdn作者:AirMario人点击

第七城市

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


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()方法。


第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台