黑马程序猿_反射、内省、泛型

------- android培训java培训、期待与您交流! ----------


反射: 

 

反射就是把Java类中的各种成分映射成对应的java类。

构造方法的反射:

onstructor类代表某个类中的一个构造方法。

得到某个类全部的构造方法:

Constructor [] constructors=Class.forName("java.lang.String").getConstructors();

得到某一个构造方法:

Constructorconstructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

获得方法时要用到类型:

创建实例对象:

通常方式:String str = newString(new StringBuffer("abc"));

反射方式: String str =(String)constructor.newInstance(new StringBuffer("abc"));

调用获得的方法时要用到上面同样类型的实例对象

Class.newInstance()方法:

String obj =(String)Class.forName("java.lang.String").newInstance();

该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。也就是使用String类的无參构造 

方法创建了一个String对象。

Filed反射练习

 ReflectPointpt1 = new ReflectPoint(3,5);
             
              Field fieldY =pt1.getClass().getField("y");//获取公有的成员变量
             
              System.out.println(fieldY.get(pt1));
             
             
              Field fieldX =pt1.getClass().getDeclaredField("x");//强行获取私有的成员变量
             
              fieldX.setAccessible(true);//能够获取私有成员变量的值
             
              System.out.println(fieldX.get(pt1));


成员方法的反射(Method):

Method类代表某个类中的一个成员方法。

得到类中的某一个方法: 

Method charAt =Class.forName("java.lang.String").getMethod("charAt",int.class);

调用方法:

通常方式:System.out.println(str.charAt(1));

反射方式: System.out.println(charAt.invoke(str,1));

假设传递给Method对象的invoke()方法的第一个參数为null,说明该Method对象相应的是一个静态方法!

数组的反射:

1、具有同样维数和元素类型的数组属于同一个类型,即具有同样的Class实例对象。

2、代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类相应的Class。

3、基本类型的一维数组能够被当作Object类型使用。不能当作Object[]类型使用;非基本类型的一维数组,既能够当做Object类型使用,又能够当做Object[]类型使用。

无法通过反射直接获得数组中元素的类型。但能够通过当中一个元素获得类型:

    a[0].getClass().getName();

泛型的反射:

通过反射获取方法。再获得方法的參数列表的类型。获取其參数的实际类型。

内省


JavaBean是一种特殊的Java类,主要用于传递数据信息,这样的java类中的方法主要用于訪问私有的字段。且方法名符合某种命名规则。

内省演示样例:

 class Person{
      
       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;
       }     
}
 


JavaBean中属性的名称參考自它的get与set方法。

如代码中的setAge()方法,属性名就为age,规则为:

假设set后的第二个字母是小写,则把第一个字母改为小写;

如setTime-à属性为time,setCPU-à属性名为CPU


注解:

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后。javac编译器,开发工具和其它程序能够用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干对应的事。标记能够加在包,类。字段,方法,方法的參数以及局部变量上。

@Deprecated表示该方法已经过时。

@Override表示该方法是重写方法。

 自定注解类:

元注解Retention的三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;

分别相应:java源文件-->class文件-->内存中的字节码。 @Target能够定义注解使用的位置。

泛型:


JDK1.5版本号以后出现新特性。用于解决安全问题,是一个类型安全机制。

泛型是提供给javac编译器使用的,能够限定集合中的输入类型。让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息。使程序执行效率不受影响,对于參数化的泛型类型,getClass()方法的返回值和原始类型全然一样。 

整个称为ArrayList<E>泛型类型ArrayList<E>中的E称为类型变量或类型參数

整个ArrayList<Integer>称为參数化的类型

ArrayList<Integer>中的Integer称为类型參数的实例或实际类型參数

ArrayList<Integer>中的<>念着typeof

ArrayList称为原始类型

參数化类型不考虑类型參数的继承关系,例如以下两种定义方法是错误的:

Vector<String> v = newVector<Object>();

Vector<Object> v = newVector<String>();

长处:

1.将执行时期出现故障ClassCastException。转移到了编译时期。方便于程序猿解决这个问题。让执行时问题降低。安全。

2。避免了强制转换麻烦。

泛型格式:通过<>来定义要操作的引用数据类型。

通常在集合框架中非经常见,

仅仅要见到<>就要定义泛型。

事实上<> 就是用来接收类型的。

当使用集合时,将集合中要存储的数据类型作为參数传递到<>中就可以。

仅仅有引用类型才干作为泛型方法的实际參数。

 泛型类:

当类中要操作的引用数据类型不确定的时候。早期定义Object来完毕扩展。如今定义泛型来完毕扩展。

泛型类定义的泛型,在整个类中有效。假设被方法使用。那么泛型类的对象明白要操作的详细类型后,全部要操作的类型就已经固定了。为了让不同方法能够操作不同类型,并且类型还不确定。那么能够将泛型定义在方法上。



 

 

 

 ------- android培训java培训、期待与您交流! ----------

 

原文地址:https://www.cnblogs.com/lcchuguo/p/5216233.html