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的案例
注:以上只是个人的总结,如有遗漏欢迎补充,谢谢!
领取专属 10元无门槛券
私享最新 技术干货