黑马程序员—java之基础加强
------- android培训、java培训、期待与您交流! ----------
你热爱生命吗?那么别浪费时间,因为时间是构成生命的材料。
——富兰克
eclipse和IDE
重点是掌握它的快捷键的使用和调试程序
比如:最常用的Ctrl+1 : 查看错误最佳处理方法. Alt+/ :补全代码
JavaEE --Java 2Platform,Enterprise Edition
ide------IntegratedDevelopment Environment(集成开发环境)
jms------Java Message Service,Java消息服务
jmx------Java ManagementExtensions,即Java管理扩展
jndi-----Java Naming andDirectory Interface,Java命名和目录接口
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块中
基础加强掌握的不是很好.