-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
第一部分
java类:
描述一类事物的共性,该类事物有什么属性,没有什么属性,至于属性是什么
则有这个类的实例对象来确定。
java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class
Person p1 = new Person();
Person p2 = new Person();
Class cls1 = 字节码1;
Class cls2 = Person.class;//字节码2;
--------------
|-代表Person类的字节码
比如现在要用到 Person Date Math三个类 那么内存中就会有三个字节码
每一个字节码就是一个Class的实例对象
p1代表字节码弄出来的对象可以通过p1.getClass();方法得到对应的字节码
Class.forName("java.lang.String")得到String的字节码
————————————
|-它的作用是返回字节码。方式一:是已经被加载了直接返回
方式二:用类加载器去加载
得到字节码的三种方式: 1.类名.class 如System.class
2.对象.getclass() 如new Date().getClass()
3.Class.forName("类名") 如Class.forName("java.lang.String")
Class类的实例对象对应各个类在内存中的字节码
一个类被加载到内存中,占用一片存储空间,这个空间里面的内容就是字节码
不同类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个空间
可以分别用一个个的对象来表示这些对象具有相同的类型Class
第二部分
//String是类 而不是基本类型
String str1 = "abc";
//str1是字符串对象。对象.getClass()就得到了String的字节码
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1==cls2);//true
System.out.println(cls3==cls2);//true
//是否是基本类型字节码 false:因为String是类不是基本数据类型
System.out.println(cls1.isPrimitive());
System.out.println(int.class.isPrimitive());//True
//false因为int和Integer各有各的字节码
System.out.println(int.class==Integer.class);
//TYPE代表包装类型所包装的(基本数据类型)Integer类型的字节码
System.out.println(int.class==Integer.TYPE);//true
//任何类型在内存中都是一个字节码,任何类型都可以用class表示
System.out.println(int[].class.isPrimitive());//false
System.out.println(int[].class.isArray());//true
//数组类型的Class实例对象 Class.isArray();是数组类型吗
//总之只要在源程序中出现的类型,都有各自的Class实例对象:例如:int[]、 void
}
第三部分
//Constructor类:得到某个类的构造方法
public class FanShe {
public static void main(String[] args) throws Exception {
// 得到某个类的所有构造方法
Constructor[] constructors =
Class.forName("java.lang.String").getConstructors();
// 得到某一个构造方法 如:得到String类中 String(StringBuffer buffer)的构造方法
Constructor constructor = //这半句代码是编译时运行的,只知道是构造方法。创建出来的是什么对象
//是后半句代码运行时才知道是String类型的,运行时才把后半句结果给constructor
Class.forName("java.lang.String").getConstructor(StringBuffer.class);
// 创建实例对象 ————————————表示选择它的构造方法
// 通常方式
String str = new String(new StringBuffer("abc"));
// 反射方式 即 通过构造方法构造一个实例对象
String str1 = (String)constructor.newInstance(new StringBuffer("abc"));
// ————————表示用的时候还要传StringBuffr的对象进来
//String str2 = (String)constructor.newInstance("abc");//编译时没错,执行才有错因为constructor对应的是接收
//StringBuffer类型的。传的是String
System.out.println(str1.charAt(2));
}
}
第四部分
public class FanShe {
public static void main(String[] args) throws Exception {
String str = "abcd";
/*用反射的方式得到字节码里面的方法(得到的是获取某个角标上的字符的方法也就是charAt)
返回的met是一个对象这个对象表示方法。用这个方法作用于字符串str和角标1;"charAt"是方法的
名字,int.class因为角标是数字所以用int.class的字节码;invoke是Method方法对象
上的方法*/
Method met = String.class.getMethod("charAt", int.class);
/*如果传递给Method对象的invoke()方法的第一个参数是null那说明该Method对象对应的是一个
静态方法:met调用是通过对象str的。如果(null,1)就是说没通过对象就调用了,
不用对象就能调用的方法是静态方法*/
System.out.println(met.invoke(str,1));//b
System.out.println(met.invoke(str,new Object[]{3}));//d
}
}
第五部分
class method {
public static void main(String[] args) throws Exception {
/* 动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象时需要用到:
String str = “用户输入的字符串” ;
Class t = Class.forName(str);*/
String start = args[0];
Method mainMethod = Class.forName(start).getMethod("main",
String[].class);
mainMethod.invoke(null, (Object) new String[] { "111", "222", "333" });
// mainMethod.invoke(null, new Object[] {new String[] { "111", "222", "333" }});
}
}
public class FanShe6 {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}