黑马程序员——java基础知识篇——>反射

-----------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

第二部分

public static void main(String[] args) throws Exception {
//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
}

第三部分

//反射就是把java类中的各种成分映射成相应的java类
//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));

}
}

第四部分

//成员方法的反射Method
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

}
}

第五部分

示例:写一个程序能根据用户提供的类名去执行该类中的main方法
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);
		}
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值