反射

来源:互联网 发布:鲁道夫·阿贝尔知乎 编辑:程序博客网 时间:2024/06/06 15:36
反射机制
反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作。
主要运用Class、Constructor、Field、Method 四个类,其中Class代表类对象,Constructor代表构造器对象,
Field类代表属性对象,Method代表方法对象,通过这四个对象可以粗略得到某个类的组成部分。

实例化类对象:
1.Class.forName(包名.类名);
2.类名.class;
3.对象.getClass();
package cn.itcast;
public class A {
public static void main(String[] args) throws Exception {
Class c=Class.forName("cn.itcast.A");
Class c1=A.class;
Class c2=new A().getClass();
System.out.println(c.getName()+"--"+c1.getName()+"--"+c2.getName());
}
}
Class主要是反射的源头,相当于拿到类的字节码文件,不光可以取得对象所在类的信息,也可以直接实例化对象。
package cn.itcast;
public class A {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.name+"--"+this.age;
}
public static void main(String[] args) throws Exception {
Class c=Class.forName("cn.itcast.A");
A a=(A) c.newInstance();
a.setName("wangwu");
a.setAge(22);
System.out.println(a.toString());
}
}
可见,反射可以不用使用new也可以实例化对象,不过以上操作必须在A类中有无参的构造函数。
以下代码可实现即使没有无参构造函数也可以实例化对象:
package cn.itcast;
import java.lang.reflect.Constructor;
public class A {
private String name;
private int age;
public A(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.name+"--"+this.age;
}
public static void main(String[] args) throws Exception {
Class c=Class.forName("cn.itcast.A");
Constructor[] cc=c.getConstructors();
A a=(A) cc[0].newInstance("lisi",23);
System.out.println(a.toString());
}
}
获取指定类的组织结构:
package cn.itcast;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class B implements ImpB{
private String name;
private int age;
public B(){};
public B(String name,int age){
this.name=name;
this.age=age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return this.name+"--"+this.age;
}
@Override
public void dosomething() {
System.out.println("学习java");
}
public void play(){
System.out.println("打篮球");
}
public static void main(String[] args) throws Exception {
Class<?> c= Class.forName("cn.itcast.B");
Class[] in=c.getInterfaces();//获取所有实现的接口
for(int i=0;i<in.length;i++){
System.out.println(in[i].getName());
}
Class<?> su= c.getSuperclass();//获取继承的类
System.out.println(su.getName());
Constructor[] con=c.getConstructors();//获取所有的构造函数
for(int i=0;i<con.length;i++){
System.out.println(con[i]);
}
Method[] me=c.getDeclaredMethods();//获取本类所有方法
for(int i=0;i<me.length;i++){
System.out.println(me[i]);
}
Method[] met=c.getMethods();//获取所有方法
for(int i=0;i<met.length;i++){
System.out.println(met[i]);
}
Field[] fi=c.getDeclaredFields();//获取本类中的属性
for(int i=0;i<fi.length;i++){
System.out.println(fi[i]);
}
Field[] fie=c.getFields();//获取接口和父类的公共属性
for(int i=0;i<fie.length;i++){
System.out.println(fie[i]);
}
}
}
interface ImpB{
public abstract void dosomething();
}
0 0
原创粉丝点击