java的高新技术

eclipse以及IDE开发

1、myeclipse是eclipse的插件,eclipse就是java开发的

2、简写;

Java ee : Java Platform,Enterprise Edition

ide: IDE的英文全称为“IntegratedDrive Electronics”,即“电子集成驱动器

jms: Java消息服务Java Message Servicejmx: Java Management Extensions

JNDI(Java Naming and Directory Interface,Java命名和目录接口

3、包名是域名倒过来写。

4、面试的时候看得的就是卷面整洁,命名准确,单词正取。     

5、配置快捷键:

 

6、视图就是每个小窗口,而透视图就是小窗口的集合。

7、如何调试:[右击]----【debug as】

变量的值:【watch】

如何快速的让选中的代码马上的形成try-catch 

【选中】--【右键】---【surround with】--【try--catch】

8、配置模板:

【windows】--【preferences】---【template】--【这个时候就可以配置模板了】

 

 

 

 

 

反射的基石Class

1、如何得到各个字节码对应的实例对象

l  类名.class 例如:System.class

l  对象.getClass(),例如:P.getClass();

l  Class.forName(类名);例如:Class.forName(“java.util.Date”);

 

注意:编译器只看变量的定义,不看代码的运行。

 

反射(还是不怎么明白)

1、反射就是把java类中的各种成分映射成为相应的java类。例如:一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法等信息也可以用一个个java类来表示,一个汽车是一个类,汽车中的发动机,变速箱等等也是一个一个的类。

Constructor类

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

l  得到某个类中的所有的构造方法:

Constructor constroctor[]=

       Class.forName(“java.lang.String”).getConstructors();

 

l  得到某一个构造方法:

Constructor constructor =

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

 

l  创建实例对象:

通常的方式:String str=new String(new StringBuffer(“abc”));

反射的方式:String str=(String)constructor.newInstance(new StringBuffer(“sc”));

 

注意:在eclipse中生成源代码的快捷键是:alt+shift+s ,然后要生成什么看哪个下面划线就单击哪个字母就可以了。

 

Filed类

1、field类代表的是某个类中的一个成员变量。

2、例子:

 

package cn.itcast.day01;

import java.lang.reflect.Field;

public class ReflectTest {

      public static void main(String[] args) throws Exception{

           //定义对象

           ReflectPoint pt1=new ReflectPoint(3,5);

           //通过对象得到对应的字节码文件,通过字节码文件的getField方法得到对象的字段

           Field fieldY=pt1.getClass().getField("y");

           //注意这里的fieldY的值不是5,想要得到具体的值要通过get方法,同时把对象传递进来。      

          

           //得到对应的字段

           //Field fieldX=pt1.getClass().getField("x");

           //这句话会报错 java.lang.NoSuchFieldException,因为x是私有的,那么怎么得到这个字段呢?

           FieldfieldX=pt1.getClass().getDeclaredField("x");

           //System.out.println(fieldX.get(pt1));

           //又出现错误 java.lang.IllegalAccessException,因为x是私有的,即使得到了,也不能够够使用

           //这时候我们采用的方法就是”暴力使用“

           fieldX.setAccessible(true);

           System.out.println(fieldX.get(pt1));

          

       //反射的例子:

      //将任意一个对象中所有的String类型的成员变量所对应的字符串中的“b”改成"a"          

      changeStringValue(pt1);

      System.out.println(pt1);

      }

     

      private static void changeStringValue(Object obj) throws Exception{

                 Field[] fields=obj.getClass().getFields();

                 for(Field field: fields){

                      //因为是同一份字节码文件,所以使用==

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

                            String oldValue=(String)field.get(obj);

                            StringnewValue=oldValue.replace('b', 'a');

                            field.set(obj,newValue);

                      }

                     

                 }

      }

}

 

Method类

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

2、 得到类中的某一个方法:

Method charAt =

 Class.forName(“java.lang.String()”).getMethod(“charAt”,int.class);

//charAt是类的名字,int.class是参数的类型

 

3、调用的方法:

通常的方法:str.charAt(1);

反射的方法:charAt.invoke(str,1);

 

注意:如果传递给Method对象的invoke()方法的一个参数为null,说明Method对象对应的是一个静态的方法。

 

      //需求:写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。

      String startingClassName =args[0];

      Method mainMethod =

                 Class.forName(startingClassName).getMethod("main",String[].class );

      mainMethod.invoke(null, (Object)new String[]{"111","222","444"});

}

 

 

数组的反射

1、   Array工具类可以用于完成对数组的反射操作

反射的作用---实现框架

综合案例:

l  先直接用new语句创建ArrayList和HashSet的实例对象,用eclipse自动生成ReflectPoint类的equals和hashcode方法,比较两个集合的运行结果的差异

l  采用配置文件加上反射的鍽꧋创建ArrayList和HashSet的实例对象,比较观察结果的差异。

 

JavaBean

1、

是一类特殊的类,这个类中的方法由set和get组成,那么它就是JavaBean。

通过set后者get可以推断出这个类中的属性。

 

2、javaBean的简单的应用

 

package cn.itcast.day01;

 

import java.beans.IntrospectionException;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;

 

public class IntroSpectorTest {

      public static void main(String[] args) throws Exception{

           ReflectPoint pt1= new ReflectPoint(3,5);

          

           //ReflectPoint中的某个属性

           String propertyName="x";

          

           //使用javaBean中的方法对属性进行操作

          

           //传递进来要修改的属性的名字以及所对应的类

           PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());

           //获取javaBean中自己所需要的方法

           Method methodGetX=pd.getReadMethod();

           //返回自己后去的值,使用内省

           Object retVal =methodGetX.invoke(pt1);

           System.out.println(retVal);

          

          

           //使用javaBean对使用set方法对其属性进行设置         

           String propertyName2 ="y";

           PropertyDescriptor pd2 = new PropertyDescriptor(propertyName2, pt1.getClass());

           Method methodSetY=pd2.getWriteMethod();

           methodSetY.invoke(pt1, 8);

          

           System.out.println(pt1.getY());

          

      }

}

 

注意:使用eclipse导入jar包的方法:【新建一个文件】--【将jar包导入】--【右键】--【build path】--【添加到buildpath中】

 

PropertyUtils:对类型转换就是本身的

BeanUtils:对类型的转换是String的。

 

注解的应用

 

1、JDk1.5的新特性:枚举、注解

2、每个注解都是一个java类

3、java提供的几个基本的注解:

@SuppressWarnings(“deprecation”) :消除了警告,对应source

@Override :为了防止子类在写父类的方法的时候出错,可以写上这个,对应source

@Deprecated :加上这个代表这个类就被删除了,别人再调用的时候就会画上横线。对应的是Runtime

4、java注解周期的三个生命阶段:java源文件-------class文件-----内存中的字节码文件,分别对应的是:@Retention的三个元注解:RetentionPolicy.SOURCE

RetentionPolicy.CLASS 和RetentionPolicy.RUNTIME

 

 

 

 

 

泛型

1、泛型是提供给javac编译器使用的,可以限定集合中输入类型,让编译器挡住源程序中非法输入,编译器编译带类型说明的集合时去掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法返回值和原始类型完全一样。同时,可以跳过编译器,使用反射得到集合然后向集合中加入其他的数据。

 

典型的例子:

package cn.itcast.day02;

import java.lang.reflect.InvocationTargetException;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

public class GenericTest {

    public static void main(String[] args) throws Exception {

       Collection<Integer> collection =newArrayList<Integer>();

       collection.getClass().getMethod("add", Object.class).invoke(collection,"agc" );

       System.out.println(collection);

    }

}

 

2、ArrayList<Integer> 中的<>读作typeof

3、使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数无关的方法,不可以调用与参数有关的方法。

举例:

       //泛型的综合例子

       HashMap<String, Integer> maps =newHashMap<String,Integer>();

       maps.put("lili",23);

       maps.put("xiaoming", 10);

      

       Set<Map.Entry<String,Integer>>entrySet = maps.entrySet();

       for(Map.Entry<String,Integer> entry : entrySet){

           System.out.println(entry.getKey()+":"+ entry.getValue());         

       }     

    }

}

 

5、dao :dataaccess object --àcrud 数据访问对象。

 

类加载器

1、java虚拟机中可以安装多个类加载器,系统默认的主要有三个:BootStrap,ExtClassLoader,AppClassLoader

 

2、类加载器之间的父子关系以及管辖的范围:
---BootStrap  ————》jre/lib/rt.jar

--ExtClassLoader ————》jre/lib/ext/*.jar

--AppClassLoader ————》classpath指定的所有jar或者目录

 

3、类加载器的委托机制:每个类加载器在加载类的时候,又先委托给其上级的类加载器进行加载。

 

代理(??)

1、AOP(Aspectoriented program,简称AOP)面向方面的编程。

2、系统中存在交叉业务,一个交叉业务就是要切入到系统中的一个面,例如:安全,日志

3、动态代理的技术:

l  JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往作为代理类,即动态代理类。

l  JVM生成的动态类必须实现一个或者多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理。

l  CGBL库可以动态的生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类动态生成代理类,可以使用CGBL库

l  代理类的各个方法中通常除了要调用目标的I型昂应的方法和对外的目标的返回的结果外,还可以在代理的方法中如下四个位置上加上系统功能代码:

²  在调用目标方法之前

²  在调用目标方法之后

²  在调用目标方法前后

²  在调用目标方法的catch块中

 

 

 

 

 

 

 

多线程

1、定义:

 

package cn.itcast.day04;

 

public class TraditionalThread {

    public static void main(String[] args){

      

       Thread thread =new Thread(){

           @Override

           public void run(){

              while(true){

                  try {

                     Thread.sleep(500);

                  } catch (InterruptedException e) {

                     // TODO Auto-generatedcatch block

                     e.printStackTrace();

                  }

                  System.out.println("1:"+Thread.currentThread().getName()); 

                  System.out.println("2:"+this.getName()); 

              }            

           }

       };

       thread.start();

      

       Thread thread2= new Thread(new Runnable() {

          

           @Override

           public void run() {

              System.out.println("1:"+Thread.currentThread().getName());           

           }

       });

       thread2.start();

      

       new Thread(

              new Runnable() {

                 

                  @Override

                  public void run() {

                     while(true){

                         try {

                            Thread.sleep(500);

                         } catch(InterruptedException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                         }

                         System.out.println("runnable"+Thread.currentThread().getName());  

                     }  

                    

                  }

              }

              ){

           public void run(){

              while(true){

                  try {

                     Thread.sleep(500);

                  } catch (InterruptedException e) {

                     // TODO Auto-generatedcatch block

                     e.printStackTrace();

                  }

                  System.out.println("thread:"+Thread.currentThread().getName());   

              }  

                           

           }

       }.start();

    }

}

 

2、定时器:

 

package cn.itcast.day04;

 

import java.util.Date;

import java.util.Timer;

import java.util.TimerTask;

 

public class TraditionalTimerTest {

      private static int count =0;       //这就变成了类的了。

     

      public static void main(String[] args){

     

           class MyTimerTask extends TimerTask {

 

                 @Override

                 public void run() {

                      count=(count+1)%2;

                      System.out.println("bombing!");

                      new Timer().schedule(/*new TimerTask() {

                           

                            @Override

                            public void run() {

                                  System.out.println("bombing!2.......");

                                 

                            }

                      }*/new MyTimerTask(), 2000+2000*count );

                 }

           }

          

           new Timer().schedule(new MyTimerTask(), 2000);//调度

          

           while(true){

                 System.out.println(new Date().getSeconds());

                 try {

                      Thread.sleep(1000);

                 } catch (InterruptedException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 }               

           }

      }

}

 

3、线程的安全问题可以用银行转账来解释

4、要用到共同的数据(包括同步锁)或者共同的算法的若干个方法应该归在同一个类中,这种设计正好体现了高类聚和程序的健壮性。

5、单例设计模式

6、Java5中的线程并发库、线程池

7、Ctrl+7  :看有什么实现类

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值