java高新技术(1)

静态导入

  importstaticjava.lang.Math.max;//导入类下的某个静态方法。

  importstaticjava.lang.Math.*;//导入类下的所有静态方法。

 

可变参数与for循环增强

 

         //可变参数方法

         public  static   int  add(int x,int… args){//int b…只能在最后一个。

                   //方法实现体。

                   //在方法中以数组的形式来使用args变量。

         }

        

         增强for循环。

         for(type 变量名:集合变量名){

                   //循环体

}

注意事项:

迭代变量必须在()定义!

集合变量可以是数组或实现Iterable接口的集合类。

 

基本数据类型的自动拆箱与装箱

 

         Integernum1 = 2;//5.0版本后的jdk自动装箱语法

         System.out.println(num1+ 3);// 5.0版本后的jdk自动拆箱语法

 

         对于基本数据类型,自动装箱会将-128~127之间的数据自动缓存起来。

Integer num1 = 12;

Integer num2 = 12;

num1 == num2 ?//true

Integer i1 = 128;

Integer i2 = 128;

I1 == i2 ?//false

享元模式:flyweight

就是把很多相同的对象封装成一个对象,而不同属性则封装成一个外部状态。

 

反射

反射的基石:Class类

Class类代表Java类,它的各个实例对象又分别对应什么呢?
对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?
如何得到各个字节码对应的实例对象( Class类型)
类名.class,例如,System.class
对象.getClass(),例如,new Date().getClass()
Class<?>getClass()
          返回此 Object 的运行时类。
Class.forName("类名"),例如,Class.forName("java.util.Date");
static Class<?>forName(String className)
          返回与带有给定字符串名的类或接口相关联的 Class 对象。

反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。 

反射学习要点

就是学会运用反射的API来获取一个类中各个成员对象,如成员变量、构造方法和普通方法,然后运用获取的对象进行操作。

 

从jdk1.2以后出现了反射的机制。 

 

Class.forName()方法作用:

返回字节码,加载方式有两种,一种是这份字节码已经加载过待在虚拟机里了直接返回,还有一种是java虚拟机中还没有这份字节码,则用类加载器去加载,把加载进来的字节码缓存在内存中。

 

 

 

 

1.      对象.getClass();

2.      类名.class;

3.      Class.forName(“类全路径限定名”);//Class.forName(“java.lang.String”)

        

Class对象的isPrimitive()方法判断某个类型是否是基本类型。

 

int.class == Integer.TYPE;//true, Integer.TYPE返回包装类的基本类型Class对象

 

只要在源程序中出现的类型,都有各自的Class实例对象。

 

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

 

Field类的getFIeld方法只能拿到可见的字段。

getDeclaredField方法可以拿到private字段。

可使用对象setAccessible(true).则可以取到私有成员的值。

 

Field类小示例:

 

private static void changeFieldValue() throwsIllegalAccessException {

      Useruser = new User();

      user.setAge(1002);

      user.setUsername("abddeb");

      Field[]fields = user.getClass().getDeclaredFields();

      for(Field field : fields) {

         field.setAccessible(true);

         if(field.getType() == String.class) {

            StringvalString = (String)field.get(user);

            StringnewVal = valString.replace('b', 'a');

            field.set(user,newVal);

         }

      }

      System.out.println(user.getAge());

      System.err.println(user.getUsername());

}

 

静态方法反射调用:

methodObj.invoke(null,””);//因为是静态方法不需要对象调用,第一个参数传空。

为了兼容jdk1.4,以数组作为方法参数被反射调用时,不能直接传入对应的一个数组对象(java会自动将数组元素拆开),此时应该对传入的数组对象再打包一次,例如:

class MethodTest{

public static void myMethod(String[] args){

 

}

}

 

 

 

数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象(此处比较与值无关)。
如:int [][] a = new int [1][3];   int [][] b = new int [1][3];   a.getclass()==b.getclass
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
Arrays.asList()方法处理int[]和String[]时的差异。
              int[] a = { 1, 2, 3, 4, 5 };
            String[] b = {  "a""b" ,  "c" ,  "d" ,  "e" };
            System.  out.println(Arrays. asList(a));  //[[I@34780af5]
            System.  out.println(Arrays. asList(b));  //[a, b, c, d, e]
 
java.lang.reflect.Array:工具类用于完成对数组的反射操作。
static Objectget(Object array, int index)
          返回指定数组对象中索引组件的值。
static intgetLength(Object array)
          以 int 形式返回指定数组对象的长度。
static voidset(Object array, int index, Object value)
          将指定数组对象中索引组件的值设置为指定的新值。
 
            String[] b = {  "a""b""c" ,  "d" ,  "e" };
              if (b.getClass().isArray()) {
                  System.  out.println(Array. getLength( b));
                  Array.  set(b , 1,  "1" );
                  System.  out.println(Arrays. asList( b));
            }
反射的作用:实现框架功能
什么是框架,例如,我们要写程序扫描.java文件中的注解,要解决哪些问题:读取每一样,在每一个中查找@,找到的@再去查询一个列表,如果@后的内容出现在了列表中,就说明这是一个我能处理和想处理的注解,否则,就说明它不是一个注解或者说至少不是一个我感兴趣和能处理的注解。接着就编写处理这个注解的相关代码。现在sun提供了一个apt框架,它会完成所有前期工作,只需要我们提供能够处理的注解列表,以及处理这些注解的代码。Apt框找到我们感兴趣的注解后通知或调用我们的处理代码去处理。
你做的门调用锁,锁是工具,你做的门被房子调用,房子是框架,房子和锁都是别人提供的。

 

 

 

 

import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
 
public  class Ts {
        public  static  void main(String[] args)  throws Exception {
              // 应该先直接用ArrayList和HashSet,然后才引入从配置文件读,这样便于学员学习。
            Properties props =  new Properties();
             // 先演示相对路径的问题
                完整路径:Jsp中
                              /*getRealPath();//金山词霸/内部          !一定要记住用完整的路径,但完整的路径不是硬编码,而是运算出来的。*/
 
                相对路径:
Class类也提供getResourceAsStream
ClassLoadergetClassLoader()
          返回该类的类加载器。
 InputStreamgetResourceAsStream(String name)
          查找具有给定名称的资源。
              // InputStream ips = new FileInputStream("config.properties");
              /*
             * 一个类加载器能加载.class文件,那它当然也能加载 classpath环境下的其他文件,既然它有如此能力,它没有理由不顺带提供这样一个方法。
             * 它也只能加载 classpath环境下的那些文件。注意:直接使用类加载器时,不能以/打头。
             */
              // InputStream ips =
              // ReflectTest2.class.getClassLoader().getResourceAsStream("cnitcast/javaenhance /config.properties");
               IDE会把src中所有的非.java的文件自动搬到bin中,所以相对路径没问题,推荐使用
              // Class提供了一个便利方法,用加载当前类的那个类加载器去加载相同包目录下的文件
              // InputStream ips =
              // ReflectTest2.class.getResourceAsStream("config.properties");
            InputStream ips = Ts. class.getResourceAsStream( "temp.properties" );
            props.load(ips);
            ips.close();
 
            String className = props.getProperty(  "className");
              Class clazz = Class. forName(className);
 
              Collection collection = ( Collection) clazz.newInstance();
              // Collection collection = new ArrayList();
              collection.add(1);
            System.  out.println(collection.size());
      }
}

静态方法反射调用:

methodObj.invoke(null,””);//因为是静态方法不需要对象调用,第一个参数传空。

为了兼容jdk1.4,以数组作为方法参数被反射调用时,不能直接传入对应的一个数组对象(java会自动将数组元素拆开),此时应该对传入的数组对象再打包一次,例如:

class MethodTest{

public static void myMethod(String[] args){

 

}

}

反射的调用:

Method method = MethodTest.class.getMethod(“myMethod”,String[].class)

Method.invoke(null,new Object[]{new String[]{“111”,”222”}});

或者:

Method.invoke(null,(Object){new String[]{“111”,”222”}});

 

 

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

Object[] a = new String[]{};//编译通过。

 

System.out.println(Arrays.asList(a));

System.out.println(Arrays.asList(newString[]{"2","3"}));

 

往HashSet添加完数据后,不要对元素中参与hashCode运算的属性进行修改,否则hashCode发生改变,当要删除该元素时将出现无法找到该元素的现象,这是会导致内存泄露的一个情况。

 

框架与框架要解决的核心问题:框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值