黑马程序员 Java高新技术二
2014-01-05 22:24
267 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
2.Class和class的区别
A:class:Java中的类用于描述一类事物的共性,该类事物有什么属性,至于这个属性的值是什么,则由此类的实例对象确定,不同的实例对象有不同的属性值。
B:Class:指的是Java程序中的各个Java类是属于同一类事物,都是Java程序的类,这些类称为Class。例如人对应的是Person类,Java类对应的就是Class。
3.对象的创建
A:类名.class:如System.class,String.class等等
B:对象.class:如new Date().getClass()或者d.getClass()。(Date d = new Date())
C:Class.forName(“类名”):如Class.forName(”java.lang.String”)
4.九个预定义的Class
A:包括八种基本类型(byte、short、int、long、float、double、char、boolean)的字节码对象和一种返回值为void类型的void.class
B:Integer.TYPE是Integer类的一个常量,它代表此包装类型包装的基本类型的字节码,所以和int.class是相等的。
基本数据类型的字节码都可以用与之对应的包装类中的TYPE常量表示
数组类型的Class实例对象,可以用Class.isArray()方法判断是否为数组类型的。
5.成员方法
static Class forName(String className)
返回与给定字符串名的类或接口的相关联的Class对象。
Class getClass()
返回的是Object运行时的类,即返回Class对象即字节码对象
Constructor getConstructor()
返回Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
Field getField(String name)
返回一个Field对象,它表示此Class对象所代表的类或接口的指定公共成员字段。
Field[] getFields()
返回包含某些Field对象的数组,表示所代表类中的成员字段。
Method getMethod(String name,Class… parameterTypes)
返回一个Method对象,它表示的是此Class对象所代表的类的指定公共成员方法。
Method[] getMehtods()
返回一个包含某些Method对象的数组,是所代表的的类中的公共成员方法。
String getName()
以String形式返回此Class对象所表示的实体名称。
String getSuperclass()
返回此Class所表示的类的超类的名称
boolean isArray()
判定此Class对象是否表示一个数组
boolean isPrimitive()
判断指定的Class对象是否是一个基本类型。
T newInstance()
创建此Class对象所表示的类的一个新实例。
代码演示
2.一个类中的组成成分
成员变量、方法、构造函数、包等信息,也用一个个java类来表示(如汽车是一个类,其中的发动机,变速箱等也是对应的一个个类),表示Java类的Class类显然要提供一系列的方法来获取其中的变量、方法、构造函数、修饰符、包等信息,这些信息就是用相应的类的实例对象来表示,他们是Field、Method、Contructor、Package等。
3.一个类中的每个成员都可用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可得到这些实例对象。
4.反射中的各种类
获取构造方法:
a:如何得到摸个类的所有构造方法:如得到String类的所有构造方法
Constructor[] cons = Class.forName("java.lang.String").getConstructors();
b:获取某一个构造方法:
Constructor con =String.class.getConstructor(StringBuffer.class);
创建实例对象:
a:通常方式:String str = new String(new StringBuffer (”abc”));
b:反射方式:String str = (String)con.newInstance(new StringBuffer(“abc”));
代码演示:
1.获取公有的成员变量:
getField(String name)和get(变量)
2.获取私有的成员变量:暴力反射
getDeclared(String name)
setAccessible(boolean b),将b设为true即可
代码演示:
1.获取某个类中的某个方法
public Method getMethod(String name,Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
每一个参数是方法名,第二个参数是参数列表
public Object invoke(Object obj,Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
参数: obj - 从中调用底层方法的对象,args - 用于方法调用的参数
如果是静态方法可以忽略对象,参数为null
代码演示:
2.用反射方式执行某个main方法
首先要明确为何要用反射:在写源程序时,并不知道使用者传入的类名是什么,但是虽然传入的类名不知道,而知道的是这个类中的方法有main这个方法,所以可以通过反射的方式,通过使用者传入的类名(可定义字符串型变量作为传入类名的入口,通过这个变量代表类名),内部通过传入的类名获取其main方法,然后执行相应的内容。
代码演示:
2.基本数据类型的一维数组不能转换为Object数组,如:
int[] a = new int[3];Object[] obj= a;这样是不成立的。
3.如何得到某个数组中的某个元素的类型:
例:int a = newint[3];Object[] obj= new Object[]{”ABC”,1};
无法得到某个数组的具体类型,只能得到其中某个元素的类型,如
Obj[0].getClass().getName()得到的是java.lang.String
若通过b.getClass().getName(),结果是:[Ljava.lang.Object;
代码演示:
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
Java高新技术二
反射的基石:Class类
1.Class是Java程序中各个Java类的总称;它是反射的基石,通过Class类来使用反射。2.Class和class的区别
A:class:Java中的类用于描述一类事物的共性,该类事物有什么属性,至于这个属性的值是什么,则由此类的实例对象确定,不同的实例对象有不同的属性值。
B:Class:指的是Java程序中的各个Java类是属于同一类事物,都是Java程序的类,这些类称为Class。例如人对应的是Person类,Java类对应的就是Class。
3.对象的创建
A:类名.class:如System.class,String.class等等
B:对象.class:如new Date().getClass()或者d.getClass()。(Date d = new Date())
C:Class.forName(“类名”):如Class.forName(”java.lang.String”)
4.九个预定义的Class
A:包括八种基本类型(byte、short、int、long、float、double、char、boolean)的字节码对象和一种返回值为void类型的void.class
B:Integer.TYPE是Integer类的一个常量,它代表此包装类型包装的基本类型的字节码,所以和int.class是相等的。
基本数据类型的字节码都可以用与之对应的包装类中的TYPE常量表示
数组类型的Class实例对象,可以用Class.isArray()方法判断是否为数组类型的。
5.成员方法
static Class forName(String className)
返回与给定字符串名的类或接口的相关联的Class对象。
Class getClass()
返回的是Object运行时的类,即返回Class对象即字节码对象
Constructor getConstructor()
返回Constructor对象,它反映此Class对象所表示的类的指定公共构造方法。
Field getField(String name)
返回一个Field对象,它表示此Class对象所代表的类或接口的指定公共成员字段。
Field[] getFields()
返回包含某些Field对象的数组,表示所代表类中的成员字段。
Method getMethod(String name,Class… parameterTypes)
返回一个Method对象,它表示的是此Class对象所代表的类的指定公共成员方法。
Method[] getMehtods()
返回一个包含某些Method对象的数组,是所代表的的类中的公共成员方法。
String getName()
以String形式返回此Class对象所表示的实体名称。
String getSuperclass()
返回此Class所表示的类的超类的名称
boolean isArray()
判定此Class对象是否表示一个数组
boolean isPrimitive()
判断指定的Class对象是否是一个基本类型。
T newInstance()
创建此Class对象所表示的类的一个新实例。
代码演示
String str1 = "abc"; Class cls1 = str1.getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String"); System.out.println(cls1 == cls2);//true System.out.println(cls1 == cls3);//true //public boolean isPrimitive() //判定指定的 Class 对象是否表示一个基本类型。 八个基本类型和void System.out.println(cls1.isPrimitive());//false System.out.println(int.class.isPrimitive());//true System.out.println(int.class == Integer.class);//false
反射
1.反射就是把Java类中的各种成分映射成相应的java类2.一个类中的组成成分
成员变量、方法、构造函数、包等信息,也用一个个java类来表示(如汽车是一个类,其中的发动机,变速箱等也是对应的一个个类),表示Java类的Class类显然要提供一系列的方法来获取其中的变量、方法、构造函数、修饰符、包等信息,这些信息就是用相应的类的实例对象来表示,他们是Field、Method、Contructor、Package等。
3.一个类中的每个成员都可用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可得到这些实例对象。
4.反射中的各种类
Constructor类
Constructor类代表某个类的构造方法获取构造方法:
a:如何得到摸个类的所有构造方法:如得到String类的所有构造方法
Constructor[] cons = Class.forName("java.lang.String").getConstructors();
b:获取某一个构造方法:
Constructor con =String.class.getConstructor(StringBuffer.class);
创建实例对象:
a:通常方式:String str = new String(new StringBuffer (”abc”));
b:反射方式:String str = (String)con.newInstance(new StringBuffer(“abc”));
代码演示:
//new String(new StringBuffer("abc")); //public Constructor<T> getConstructor(Class<?>... parameterTypes) //参数是参数类型返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法 Constructor constructor1 = String.class.getConstructor(StringBuffer.class); //public T newInstance(Object... initargs) //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。 //如果是"abc"运行报错参数不匹配,因为这个构造方法对应的是接收StringBuffer类型的构造方法,你在调用的时候传来String //而不是启动一个StringBuffer,编译期看不到,因为编译器只知道你是构造方法,所以运行就报错 String str2 = (String)constructor1.newInstance(/*"abc"*/new StringBuffer("abc")); System.out.println(str2.charAt(2));//c
Field类
Field类 代表成员变量(字段)的反射1.获取公有的成员变量:
getField(String name)和get(变量)
2.获取私有的成员变量:暴力反射
getDeclared(String name)
setAccessible(boolean b),将b设为true即可
代码演示:
ReflectPoint pt1 = new ReflectPoint(3,5); //public Field getField(String name) //参数是字段名,返回一个 Field对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 Field fieldY = pt1.getClass().getField("y"); //fieldY的值是多少?是5,错!fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值 System.out.println(fieldY.get(pt1));//5 //public Field getDeclaredField(String name) //参数字段名,返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 Field fieldX = pt1.getClass().getDeclaredField("x"); //public void setAccessible(boolean flag) //值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。用于访问私有变量。 fieldX.setAccessible(true); System.out.println(fieldX.get(pt1));//3
Method类
Method类 代表某个类中的一个成员方法1.获取某个类中的某个方法
public Method getMethod(String name,Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
每一个参数是方法名,第二个参数是参数列表
public Object invoke(Object obj,Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
参数: obj - 从中调用底层方法的对象,args - 用于方法调用的参数
如果是静态方法可以忽略对象,参数为null
代码演示:
//public Method getMethod(String name,Class<?>... parameterTypes) //返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 //每一个参数是方法名,第二个参数是参数列表 Method methodCharAt = String.class.getMethod("charAt", int.class); //public Object invoke(Object obj,Object... args) //对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 //参数: obj - 从中调用底层方法的对象,args - 用于方法调用的参数 //如果是静态方法可以忽略对象,参数为null System.out.println(methodCharAt.invoke(str1, 1));//b System.out.println(methodCharAt.invoke(str1, new Object[]{2}));//c
2.用反射方式执行某个main方法
首先要明确为何要用反射:在写源程序时,并不知道使用者传入的类名是什么,但是虽然传入的类名不知道,而知道的是这个类中的方法有main这个方法,所以可以通过反射的方式,通过使用者传入的类名(可定义字符串型变量作为传入类名的入口,通过这个变量代表类名),内部通过传入的类名获取其main方法,然后执行相应的内容。
代码演示:
private static void methodTest(String [] args) throws Exception { String str1 = "abc"; //一般方法: System.out.println(str1.charAt(1)); //反射方法 : Method methodCharAt = Class.forName("java.lang.String").getMethod("charAt",int.class); System.out.println(methodCharAt.invoke(str1,1)); //用反射方式执行某个main方法 //一般方式: Test.main(new String[]{"111","222","333"}); System.out.println("-------"); //反射方式: String startingClassName = args[0]; Method methodMain = Class.forName(startingClassName).getMethod("main",String[].class); //方案一:强制转换为超类Object,不用拆包 methodMain.invoke(null,(Object)new String[]{"111","222","333"}); //方案二:将数组打包,编译器拆包后就是一个String[]类型的整体 methodMain.invoke(null,new Object[]{new String[]{"111","222","333"}}); } //定义一个测试类 class Test{ public static void main(String [] args){ for(String arg : args){ System.out.println(arg); } } }
数组的反射
1.数组字节码的名字:有[和数组对应类型的缩写,如int[]数组的名称为:[I2.基本数据类型的一维数组不能转换为Object数组,如:
int[] a = new int[3];Object[] obj= a;这样是不成立的。
3.如何得到某个数组中的某个元素的类型:
例:int a = newint[3];Object[] obj= new Object[]{”ABC”,1};
无法得到某个数组的具体类型,只能得到其中某个元素的类型,如
Obj[0].getClass().getName()得到的是java.lang.String
若通过b.getClass().getName(),结果是:[Ljava.lang.Object;
代码演示:
int [] a1 = new int[]{1,2,3}; int [] a2 = new int[4]; int[][] a3 = new int[2][3]; String [] a4 = new String[]{"a","b","c"}; System.out.println(a1.getClass() == a2.getClass());//true //System.out.println(a1.getClass() == a4.getClass());//false //System.out.println(a1.getClass() == a3.getClass());//false System.out.println(a1.getClass().getName());//[I System.out.println(a3.getClass().getName());//[[I System.out.println(a4.getClass().getName());//[Ljava.lang.String; System.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object System.out.println(a4.getClass().getSuperclass().getName());//java.lang.Object Object aObj1 = a1; Object aObj2 = a4; //基本类型的一维数组,它是不能转换成Object数组的,因为int数组里装的是int类型不是Object的 //Object[] aObj3 = a1; Object[] aObj4 = a3; Object[] aObj5 = a4; System.out.println(a1);//[I@30c028cc System.out.println(a4);//[Ljava.lang.String;@17b68215
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员 Java高新技术---反射
- 黑马程序员---Java高新技术1
- 黑马程序员 - Java 高新技术2
- 黑马程序员——Java高新技术_反射
- 黑马程序员 JAVA__高新技术--泛型总结
- 黑马程序员_Java高新技术_注解
- 黑马程序员——JAVA高新技术总结(一)
- 黑马程序员_Java高新技术——反射,常见名词解释
- 黑马程序员-Java高新技术之类加载器和代理
- 黑马程序员_java高新技术_JDK1.5新特性
- 黑马程序员java高新技术——反射
- 黑马程序员_java基础之反射及高新技术
- 黑马程序员——java高新技术——反射
- 黑马程序员——java高新技术-jdk1.5新特性,注解,类加载器,代理
- 黑马程序员 Java高新技术---注解
- 黑马程序员——高新技术---Java基础语法—面向对象_构造方法,static 关键字
- 黑马程序员_Java高新技术_交通灯管理系统
- 黑马程序员_Java 高新技术(5)
- 黑马程序员--java高新技术学习
- 黑马程序员--Java高新技术--JDK1.5新特性(下)