for java beginner 9 java反射的概念和Constructor 类

java 反射 的概念 和 Constructor 类

反射就是把 Java 类中的各种成分映射成相应的 JAVA类。

JAVA类 就是那个字节码 有包名 getPackage() 后 得到一个类 Packgae

类似的
把 各个方法  映射 成 Method 类
。。。。。。。。。。。。。

先介绍反射 时 用到的最重要的一个 类
Constructor 构造函数

======================================
package com.ncs;

import java.lang.reflect.Constructor;

public class ReflectTest {
	public static void main(String[] args) throws Exception {
		
		//下面这行  有 处理 异常 ClassNotFoundException 谁知道有没有这个类
		//这是得到所有的 构造 方法
		Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
		
		//得到某一个特定的构造 方法 有 处理 异常 NoSuchMethodException 谁知道有没有这个 构造 方法
		//注意,一个类的构造 方法N 多,不可能用 123去指定某一个特定的构造方法,只可以指定 参数 
		//这里getConstructor(StringBuffer.class);是1.5新的 可变参数 以前是数组类型参数
		//现在是 Class<?>... parameterTypes
		Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
		
		//我现在要做一件事情 new String(new StringBuffer("abc"));
		//我想用反射做
		//上面已经得到了那个 构造函数 ,而且参数也是 StringBuffer的
		//Constructor类有一个重要的 方法newInstance(arg0); 每call一次就弄一个新的
		//当然,参数不是 StringBuffer也可以编译过,
		//编译器只管你这个是 构造 方法么就OK了,管你是什么参数
		//编译器还不知道这个constructor是对应参数为StringBuffer的构造函数呢!!
		//甚至编译器连这个 constructor 是哪个类的都不管
		// 编译器只知道这个是 Constructor 的实例,这个实例有个方法叫newInstance,参数可变
		//编译器其他什么都不管
		//所以我们还要自己把结果 强制 转化为自己需要的类型(String)
		//但是 ,到了 runtime,JVM就清楚的知道了,
		//所以有 运行时错误 和 编译时错误之分
		//就是说你现在传 一个String类型,compiler不会说你错,但是你一运行,JVM就说不对了
		String myString = (String)constructor.newInstance(new StringBuffer("abc"));
		
		
		
		//test
		System.out.println(myString.charAt(2));
		
		//out c OK!S
		
		//上面的方式有三步,中间需要 constructor 
		//有人偷懒,因为很多类 都有 规定 必须 要有无参 构造函数,所以有个方法
		//Class.newInstance() 直接call 无参 构造函数
		String s1 = (String)Class.forName("java.lang.String").newInstance();
		
		
	}
}

==========================================

你可能感兴趣的:(java,jvm)