张孝祥JAVA加强1笔记


拆箱装箱,上转下转

overload(重载) 与override(重写)的区别
静态导入:
import static java.lang.Math.max --导入包下的方法,再次再方法里调用的时候可以直接使用方法名,而不必在写类名.方法名了

各个关键字解释

java ee ---->

ide ---->IDE是英文Integrated Drive Electronics的缩写,翻译成中文叫做“集成驱动器电子(集成开发环境)”,

jms ---->jms即Java消息服务(Java Message Service)

jmx ---->JMX(JavaManagementExtensions,即Java管理扩展)

jndi ---->JNDI(Java Naming and Directory Interface,Java命名和目录接口)


享元模式 Flyweight Pattern
个人总结:
享元模式是为了减少内存使用量而出现的,它将多个细小的元素封装到了一个对象中。即时享元内,
例如26个英文字母,经常被用到,那么26个英文字母就被封装一个对象,这样大大的降低了内存使用率
不然每次用到一个字母的时候就实例一个对象,对内存的消耗是不容小视的。

========================================================================================================
反射:


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

反射的概念,Constructor(构造方法)、Field(字段)、Method(方法)  Package等等的反射,
------------------------------------------------------------------------------------------------
Constructor(构造方法):
得到某个类所有的构造方法:
例子:Constructor constructor[] = Class.forName("java.lang.String").getConstructor();

得到某一构造方法:
例子:Constructor constructor = Class.forName("java.lang.String").getConstrctor(StringBuffer.class);
//获得方法时要用到的类型


创建实例对象
通常方式 String str = new String(new StringBuffer("abc"));
反射方式: String str = (String)constructor.newInstantce(new StringBuffer("abc"));
constructor.newInstance();构造方法
//调用获得的方法时要用到上面相同类型的实例对象

Class.newInstance()方法:
例子:String obj  = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用构造方法创建实例对象。
该方法内部的具体代码时如何写?用到了缓存机制来保存默认构造方法的实例对象。
此构造方法与构造器的构造方法不同之处是一个有参一个是无参,这种更方便,操作起来更简便
------------------------------------------------------------------------------------------------

Field类
Field类代表某个类中的一个成员变量

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

ReflectPoint pt1= new ReflectPoint(15,25);
Field field = pt1.getClass().getField("y");
//field 是 25 吗? 不是,那只是ReflectPoint 下的Y元素的字节码
field.get(pt1);//这次才是真正的25
}

当无法访问外类的似有成员时可以使用暴力反射
Field f2 = pt1.getClass().getDeclaredField("x"); //忽略访问权限,不论如何得都可见可访问的对象
f2.setAccessible(true);//设置X的 访问权限,如果不设置这步,只能得到字段但却得不到字段中的值
System.out.println(f2.get(pt1)); //输出x结果


class ReflectPoint{

ReflectPoint(int i,int j){
this.x = i;this.y =j;
}
int x;
int y;
}

------------------------------------------------------------------------------------------------
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(0方法的一个参数为null,这说明该Method对象对应的是一个静态方法。

//要调用str.CharAt(2);的方法用反射方式实现
  String str = "abcdefg";
  Method mt = String.class.getMethod("charAt", int.class);
  Object str2 = mt.invoke(str, 2); //返回的是Object但是若强转成String格式会报错:不能将char类型转换成String
  System.out.println(str2.toString());

 

------------------------------------------------------------------------------------------------

调用main方法
为什么要用反射?

 


------------------------------------------------------------------------------------------------
数组的反射

代码实现判断是否是数组

private static void printObject(Object obj) {
  // TODO Auto-generated method stub
  Class clazz = obj.getClass();
  if(clazz.isArray()){
   int x = Array.getLength(obj);
   for(int i =0;i<x;i++){
    System.out.println("obj数组是"+Array.get(obj, i));
   }
  }else{
   System.out.println("obj是"+obj);
  }
  
 }

若要判断数组中的某个元素是什么类型可以用a[0].getClass().getName();
但是无法判断该数组是个什么类型。

------------------------------------------------------------------------------------------------


反射的综合案例
hashCode方法与HashSet类
如果想查找一个集合中是否包含有某个对象,通常是注意取出每个元素要查询的对象进行比较,当发现某个元素
与要查询的对象进行equals方法比较结果相等时,则停止继续查找并返回肯定的信息,否则,返回否定信息。如果一个集合
含有多个元素,比如一万个元素,并且没有包含要查找的对象时,则意味着你的程序需要大量的查询,有人发明了一种
哈希算法提高从集合中查找元素的效率,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,
可以将哈希码分组,每组分别对应某个区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域,然后再确定某个区域
后在从小区域内找到所要查找的信息,这样就可以大大降低了查询的次数,并且降低对内存的消耗。


内存泄露:
如果在Hashset集合中的元素再次修改,则Hashcode也将改变,如果在删除原来的元素时,是按照原来的 Hashcode查找位置删除。
但是修改后的却不在原来的位置,所以修改后的元素在程序结束前则永远无法删除。如果反复的增加删除操作后,内存就会慢慢减少。
这就造成了内存泄露。所谓内存泄露就是内存在删除后仍然占用内存空间

 

使用properties文件来控制class得到的存放方式
InputStream ips = new FileInputStream("config.properties");//先得到文件,文件是 key=value格式
  Properties pro = new Properties();
  pro.load(ips);
  String className = pro.getProperty("className");
  Collection collections = (Collection)Class.forName(className).newInstance();
  
  
  ips.close();//为了节省资源,以防内存泄露,释放的是ips调用的资源,而非InputStream本身,
  //就好比在JAVAC中写了一个程序,java关闭后但是写的那个程序依然存在。
ReflectPoint re1 = new ReflectPoint(3,5);
  ReflectPoint re2 = new ReflectPoint(4,5);
  ReflectPoint re3 = new ReflectPoint(5,3);
  ReflectPoint re4 = new ReflectPoint(3,5);
  //collection.add(re1);//如果添加是同一个对象的话,Hashset则只存储一个,如果是ArrrayList则是两个
  collections.add(re1);
  collections.add(re2);
  collections.add(re3);
  collections.add(re4);
  
  System.out.println(collections.size());

------------------------------------------------------------------------------------------------

JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

暴力反射:可以一个类中操作另一个类的private 属性
 
对接收数组参数的成员方法的反射,数组与Object的关系及其反射类型, 数组的反射应用,框架的概念及用反射技术开发框架的原理。
============================================================================================================


框架原理:
框架是在你还没有组建代码和类的时候就已经提前建造好的,当你写工程的时候使用框架只是用框架来调用你写好的类,然而在创建
框架时并不知道要调用哪个类所以根本无法用new来实现所以只能用Class.反射等方法来实现。

 

如何得到各个字节码对应的实例对象
类名:class,例如,System.class
对象.getClass().例如,new Date().getClass()
Class.forName("类名"),例如:Class.forName("java.util.Date");
System.out.println(int.class.isPrimitive);//查看字节码是否是个基本类型
System.out.println(int.class == Integer.class);
System.out.println(int.class == Integer.TYPE);// true,integer的基本类型
System.out.println(int[].class.isArray); //校验类型是否是数组

 

 

 


不理解区域:
Constructor:

Constructor constructor = String.class.getConstructor(StringBuffer.class);
  String str = (String)constructor.newInstance(new StringBuffer("aaa"));
  System.out.println(str.toString());

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值