黑马程序员___ 基础加强篇(二)

1 篇文章 0 订阅
1 篇文章 0 订阅

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



一、本篇先说完上次的反射内容,之后说内省。

张老师视频中根据反射原理,写的一个小框架。用来读取配置文件,来使用类,相当于注入bean。

代码是:

package com.heima;

public class ReflectPoint {  private int x;    public  int y;    public String s1 = "hellam";  public String s2 = "basketball";

 public ReflectPoint(int x, int y) {   super();   this.x = x;   this.y = y;  }

 @Override  public String toString() {   // TODO Auto-generated method stub   return s1+"--"+s2;  }

 @Override  public int hashCode() {   final int prime = 31;   int result = 1;   result = prime * result + x;   result = prime * result + y;   return result;  }

 @Override  public boolean equals(Object obj) {   if (this == obj)    return true;   if (obj == null)    return false;   if (getClass() != obj.getClass())    return false;   ReflectPoint other = (ReflectPoint) obj;   if (x != other.x)    return false;   if (y != other.y)    return false;   return true;  }   }

配置文件内容:(文件放在工程主目录下)
className=java.util.HashSet
主程序:

package com.heima;

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Properties;

public class ReflectTest2 {

 /**   * @param args   * @throws IOException   * @throws ClassNotFoundException   * @throws IllegalAccessException   * @throws InstantiationException   */  public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException {      InputStream in = new FileInputStream("config.properties");   Properties props = new Properties();   props.load(in);   in.close();   String className = props.getProperty("className");   Collection collection = (Collection)Class.forName(className).newInstance();   ReflectPoint pt1 = new ReflectPoint(3, 3);   ReflectPoint pt2 = new ReflectPoint(4, 5);   ReflectPoint pt3 = new ReflectPoint(4, 5);   collection.add(pt1);   collection.add(pt2);   collection.add(pt3);   System.out.println(collection.size());     }

}

二、javaBean内省操作(注释为最优代码)
代码:

package com.heima;

import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;

public class IntroSpectorTest {  public static void main(String[] args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {   ReflectPoint pt1 = new ReflectPoint(3, 5);   String propertyName = "x";      Object returnVal = getProperty(pt1, propertyName);   System.out.println(returnVal);      Object value = 7;      setProperties(pt1, propertyName, value);   System.out.println(pt1.getX());  }

 private static void setProperties(ReflectPoint pt1, String propertyName,    Object value) throws IntrospectionException,    IllegalAccessException, InvocationTargetException {   PropertyDescriptor pd2 = new PropertyDescriptor(propertyName, pt1.getClass());   Method methodSetX = pd2.getWriteMethod();   methodSetX.invoke(pt1, value);  }

 private static Object getProperty(ReflectPoint pt1, String propertyName)    throws IntrospectionException, IllegalAccessException,    InvocationTargetException {   /*PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());   Method methodGetX = pd.getReadMethod();   Object returnVal = methodGetX.invoke(pt1);*/   BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());   PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();   Object returnVal = null;   for(PropertyDescriptor pd : pds) {    if(pd.getName().equals(propertyName)) {     Method methodGetX = pd.getReadMethod();     returnVal = methodGetX.invoke(pt1);     break;    }   }   return returnVal;  } }

注意学会如何,使用myeclipse抽取方法。。。Extract Method
 
三、注解(JDK1.5的新特性)

1. jdk中自带的三个注解

@Deprecated 声明方法已过时

@SuppressWarnings  取消编译器警告

@Override 声明方法是继承自父类

2.  什么是注解

注解就是java代码中的特殊标记,它用于告诉调用者类应该如何被运行

注解相当于配置文件的功能

3. 自定义注解

使用 @interface 关键字可以声明一个注解

public @interface MyAnnotation1

注解中可以定义属性

String name default “aaa”;

value是注解中的特殊属性

注解中定义的属性如果名称为 value, 此属性在使用时可以省写属性名

4.元注解  元Annotation

元注解简单理解为 注解的注解

类似于描述一个注解的信息的配置文件

@Retention 指定注解的作用域

RetentionPolicy.SOURCE

RetentionPolicy.CLASS  default

RetentionPolicy.RUNTIME

@Target:指定注解用于修饰类的哪个成员. 

@Target 包含了一个名为 value,类型为ElementType的成员变量。

@Inherited: 被它修饰的 Annotation 将具有继承性.

如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解

5. 反射注解

在程序可以通过反射来获取注解中封装的值


四、 泛型

1. 泛型是一种可变化的类型

类型不确定,需要调用者来指定

2. 用途:

一个类的多个成员方法用到的参数类型都是未知的类型,但又需要是同一个类型,就可将方法的参数类型

定义为泛型,此泛型必须在类上先予以声明才能在方法中使用

一个方法的多个参数和返回值需要是同一个类型,也可以用泛型来解决,在返回值前面声明泛型

3. 泛型的基本概念

以List<E>为例:<>念着typeof 例, List<String> 就是 List typeof String

List<E>中的E称为类型参数变量  

List<Integer>中的Integer称为实际类型参数

整个List<E>称为泛型类型

整个List<Integer>称为参数化的类型

4. 泛型的使用

1)使用带泛型的类时,在创建对象时可以为泛型指定实际类型参数,指定的具体类型相当于给泛型传参

2)子类在继承父类的时候,可以为父类定义的泛型指定实际类型参数

class B<T>

class A extends B<String>

通过子类A获得的父类类型就是一个参数化的类型

3)调用方法时传入参数的具体类型将作为方法中泛型的实际类型

五、动态代理

我们可以为某一个对象生成一个代理对象

代理对象要和被代理的对象实现同样的接口

代理对象的方法被调用时,我们可以做一些动作,再去调用真正被代理对象的方法

在代理对象中对用户的权限进行检查

所有的过滤器都可以用代理模式来解决

javaweb 重点

1. 请求转发 (mvc)

2. 请求重定向  302+location

3. web开发的四个域对象  page request session application

4. jsp 九个隐式对象  el取值  jstl 核心库  fn标签库

5. filter 的运行原理以及常用案例

6. 文件上传

7. javamail 注册成功发邮件

8. 会话技术 Cookie Session 明白原理

9. jdbc

10. 综合案例 编码能力提高

 





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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值