黑马程序员—java之基础加强

黑马程序员—java之基础加强

 

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

你热爱生命吗?那么别浪费时间,因为时间是构成生命的材料。

——富兰克

 

 

eclipse和IDE

重点是掌握它的快捷键的使用和调试程序

比如:最常用的Ctrl+1 : 查看错误最佳处理方法. Alt+/ :补全代码

 

JavaEE --Java 2Platform,Enterprise Edition

ide------IntegratedDevelopment Environment(集成开发环境)

jms------Java Message ServiceJava消息服务

jmx------Java ManagementExtensions,即Java管理扩展

jndi-----Java Naming andDirectory InterfaceJava命名和目录接口

 

eclipse工程管理与快捷键配置

首先你要创建一个自己的工作区, 然后再把工程放入到你的工作区中

 

编译器,运行器

Window

__|--->Perferences(首选项)

____|--->Compiler(编译器)可以说是javac.exe

____|--->Installed JREs(运行时JDK版本)java.exe

 

快捷键配置:(工作间设置)

File

__|-->Switch Workspace(切换工作间)

____|-->Other(创建其它工作间)说这里是因为每一个配置仅仅对这个工作间下的程序好使

Window

__|--->Perferences(首选项)

____|--->General(常规)

_______|-->Keys()

_________\-->搜索,Content Assist(内容助理)

___________\-->选中之后,UnbindCommand然后在Binding输入自己想要的快捷键即可,比如Alt+/

 

eclipse程序调试

 

例如程序如下:

  class StaticImport

  {  publicstatic void main(String[] args)

      {

            intx = 1;

 ·           x++;

 ·          System.out.println(x);

      }

  }

 

程序调试:

1,加断点,在程序行前双击即可

2,右键debug运行.

3,点击这个变量(x)右键watch.就可以在Expressios看到值

4,点上面的小箭头(位置在上面的Debug下从左往右数第七个,一个向下的箭头加一个下划线)

 

配置eclipse的编译于运行环境

 

编译器,运行器

Window

__|--->Perferences(首选项)

____|--->Compiler(编译器)可以说是javac.exe

____|--->Installed JREs(运行时JDK版本)java.exe(想要更改jre在这里点Add然后选择jdk的目录即可)

 

运行环境:

右键-->RunAs-->OpenRun Dialog->JRE

eclipse中配置java模板代码

选择java模板代码之一

右键->SurroundWith->选择即可

 

编辑模板代码

Perferences-->Java-->Editor-->Templates-->New

 

try

{

       ${line_selection}//这里的选项是在InsertVariable选择的

}

finally

{

       ${cursor}//光标

}

 

eclipse中导入已有工程

 

最简单的是直接剪切(复制)放入到你的工作区中,

然后再在eclipse中创建一个同名的工程

 

PackageExplorer-->右键-->Import-->ExistingProjects into Workspace-->

--->Borwse 建议选中这个对话框中的Copy projects into workspace--->Finish

!!!如果JDK环境不一样,继续下面的步骤

选中项目-->右键-->Build Path-->Configure BuildPath-->Libraries-->点击库,删除掉,然后再增加自己所需要的库

Add Library增加库(不是Add JARs增加单独的jar)

增加自定义库-->AddLibrary->>User Library-->User Libraries..-->New(起个名)-->Import

 

Add JARs//增加工程下的jar(就是说在工程目录下的jar)

Add External JARs//增加工程外部的jar(就是说不在工程目录下的jar)

 

Java5的静态导入与编辑器语法设置

 

import staticjava.lang.Math.*;

import static java.lang.Math.max;

//以上是两种导入方式

 

类加载器

顾名思义,类加载器(classloader)用来加载Java 类到Java 虚拟机中。一般来说,Java虚拟机 使用 Java 类的方式如下:

Java 源程序(.java文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个Java类。通过此实例的newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如Java字节代码可能是通过工具动态生成的,也可能是通过网络下载的。

基本上所有的类加载器都是java.lang.ClassLoader类的一个实例

 

三个主要加载类

Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类:
BootStrap,ExtClassLoader,AppClassLoader
·类加载器也是Java类,因为其是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap
·Java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载

类加载器之间的父子关系和管辖范围图

 

编写自己的类加载器

1,自定义加载器必须继承ClassLoader

2,loadClass方法为父类方法(去找父类加载器)findClass方法(自己的加载器的方法,只需要覆盖这货就哦啦)

3,defineClass(将得到的class文件转换成字节码)

 

package cn.itcast.day2;

 

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

 

public class MyClassLoader extendsClassLoader{

         //加密部分

         publicstatic void main(String[] args) throws Exception {

                   //TODO Auto-generated method stub

                   StringsrcPath = args[0];//目标目录

                   StringdestDir = args[1];//源目录

                   FileInputStreamfis = new FileInputStream(srcPath);

                   StringdestFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);

                   StringdestPath = destDir + "\\" + destFileName;

                   FileOutputStreamfos = new FileOutputStream(destPath);

                   cypher(fis,fos);

                   fis.close();

                   fos.close();

         }

        

         privatestatic void cypher(InputStream ips ,OutputStream ops) throws Exception{

                   intb = -1;

                   while((b=ips.read())!=-1){

                            ops.write(b^ 0xff);

                   }

         }

 

         privateString classDir;

         //解密部分

         @Override

         protectedClass<?> findClass(String name) throws ClassNotFoundException {

                   //TODO Auto-generated method stub

                   StringclassFileName = classDir + "\\"  +name.substring(name.lastIndexOf('.')+1) + ".class";

                   try{

                            FileInputStreamfis = new FileInputStream(classFileName);

                            ByteArrayOutputStream bos = new ByteArrayOutputStream();

                            cypher(fis,bos);

                            fis.close();

                            System.out.println("aaa");

                            byte[]bytes = bos.toByteArray();

                            returndefineClass(bytes, 0, bytes.length);

                   }catch (Exception e) {

                            //TODO Auto-generated catch block

                            e.printStackTrace();

                   }

                   returnnull;

         }

        

         publicMyClassLoader(){

                  

         }

        

         publicMyClassLoader(String classDir){

                   this.classDir= classDir;

         }

}

 

package cn.itcast.day2;

//做加密用的,对此进行加密处理

//加密处理后放的class入到itcastlib文件夹下

import java.util.Date;

 

public class ClassLoaderAttachment extendsDate {

         publicString toString()

         {

                   return"hello,itcast";

         }

}

 

 

 

 

内省

内省 (IntroSpector) 的作用是对 JavaBean 对象进行操作。内省是一种特殊的反射。JavaBean对象在项目中用来在两个模块中进行值传递。JavaBean 中的属性(或字段)必须要有 setter/getter 方法

反射的情况下,为了对 JavaBean 中的属性操作(设置和获取) 更加方便,sun 公司便提供了内省(IntroSpector) 这套api。

JavaBean是一个特殊的Java类,

方法打头一定要是get,或者set

class Person

{

         privateint x;

         publicint getAge()//返回这个对象的Age属性,注意!!!get不能有参数,

         {

                   returnx;

         }

         publicvoid setAge(int age)//设置Age属性.注意!!没有返回值

         {

                   this.x= age;

         }

}

 

代理

1、代理类的作用与原理

要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,

例如:异常处理、日志、计算方法的运行时间、事务管理等,可以编写一个与目标类具有相同接口的代理类,

代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。

 

如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置的是使用目标类还是代理类,这样以后很容易切换,

譬如,想要日志功能时就配置代理类,否则就配置目标类,这样,增加系统功能很容易,以后运行一段时间后,又想去掉系统功能也很容易

 

动态代理

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

 

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

 

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

 

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

1,在调用目标方法之前

2,在调用目标方法后

3,在调用目标方法前后

4,在处理目标方法异常的catch块中

 

基础加强掌握的不是很好.

 

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值