Java程序员编程学习—反射知识总结

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

给你学习路线:html-css-js-jq-javase-数据库-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm

Java反射

Java中都是对象,静态成员和普通数据类型不是对象;

类是对象;类是java.lang.Class的实例对象;

比如:写1个A类,A是一个对象,是Class类的实例对象;

public class ClassDemo1 {

public static void main(String[] args) {

//Foo的实例对象如何表示呢?foo1就是Foo的实例对象

Foo foo1=new Foo();

//Foo也是一个实例对象,是Class的实例对象,不能new出来;

//任何一个类(比如Foo类)都是Class的实例对象,这个Class的实例对象有3种表示方式;

//第一种表示方式;已知类名Foo,任何一个类都有一个隐含的成员变量class

Class c1=Foo.class;

//第二种表达方式:已知该类的对象,通过getClass方法;

Class c2=foo1.getClass();

//官网c1,c2表示了Foo类的类类型(class type);

//类也是对象,是class的实例对象;

//这个对象我们称为该类的类类型;

//不管c1或者c2都代表了Foo类的类类型,一个类只能是Class类的一个实例对象;

System.out.println(c1==c2);//true

//#####一个类只能是Class类的一个实例对象;

//#####如果知道类名,就用Foo.class表示Foo类的类类型

//#####如果知道实例对象,就用foo1.getClass()表示Foo类的类类型;

//不管是哪种方式表示Foo类的类类型,都是true;

//第三种表达方式:Class.forName("com.imooc.reflect.Foo")

Class c3=null;

try {

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

System.out.println(c2==c3);//true

//类类型通过newInstance()创建该类的实例对象;

//****我们完全可以通过类的类类型创建该类的实例对象,通过c1或者c2或者c3创建Foo的实例;

//c1如果是A类的类类型,通过newInstance创建的就是A类型的实例对象;

//c1如果是B类的类类型,通过newInstance创建的就是B类型的实例对象;需要强制转换

try {

Foo foo=(Foo)c1.newInstance();//前提是需要有无参数的构造方法

foo.print();//foo

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

}

//class Foo{}也是一个对象,是java.lang.Class的实例对象;

class Foo{

void print(){

}

}

动态加载类

Class.forName(“包名.类名”);不仅表示了类的类的类类型,还表示了动态加载类;

编译时刻加载类是静态加载类,运行时刻加载类是动态加载类;

new创建对象是静态加载类;在编译时刻就需要加载所有的可能使用到的类;

通过动态加载类:加载该类的类类型;

注意:功能性的类尽量使用动态加载类Class.forName();通过类类型newInstance()创建一个接口;然后增加多个子类去实现这个接口;不影响主程序;只是增加子类去实现接口;方法名相同,子类却有不同的实现;

getDeclaredFields获取的是该类自己声明的成员变量的信息;

方法的反射

1.如何获取某个方法?

方法的名称和方法的参数列表才能唯一决定某个方法;

2.方法的反射的操作

Method.invoke(对象,参数列表)

注意:如果参数列表中没有参数,可以不传参数或者传一个空的数组Object类型的;

例如:

//获取方法print(String,String);

Method m1=c.getMethod("print",String.class,String.class);

//a1.print("hello","world");

//用方法进行反射操作

o=m1.invoke(a1, "hello","world");

//获取方法print()

//Method m2=c.getMethod("println",new Class[]{});//没有参数就不传或者传一个空的数组;

Method m2=c.getMethod("println");

//a1.println();

//用方法进行反射操作;

m2.invoke(a1);

//m2.invoke(a1,new Object[]{});//或者没有参数就传一个空的数组或者不传

#############################

Java的案例

注:以上只是个人的总结,如有遗漏欢迎补充,谢谢!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180315A1TVW000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券