Class.forName("java.lang.String");
Class.forName()作用:1、字节码已经存在java虚拟机里,直接生成字节码的对象
2、字节码在内存中不存在,通过类加载器从磁盘中加载到内存中,再生成字节码的对象
获取字节码的方式:
1、类名.class (System.class)
2、对象.class (new Date().getClass())
3、Class.forName("类名") (Class.forName("java.util.Date"))
反射:就是将java类中的各种成分映射成相应的java类
构造方法的反射应用。Constructor con = String.class.getConstructor(StringBuffer.class);
String s = (String)con.newInstance(new StringBuffer("abc"));
new一个实例
import java.lang.*;
class A
{
public static void main(String[] args) throws Exception
{
A a = A.class.newInstance();
}
public A(int a)
{
System.out.println("A(int a)");
}
/*
public A()
{
System.out.println("A()");
}
*/
}
这段代码会报错,因为无 无参构造方法。
Field类:
import java.lang.*;
import java.lang.reflect.*;
class A
{
private int x;
public int y;
public static void main(String[] args) throws Exception
{
A b = new A(1,2);
Field fieldx = b.getClass().getDeclaredField("x");
System.out.println(fieldx.get(b));
Field fieldy = b.getClass().getField("y");
System.out.println(fieldy.get(b));
}
public A(int x,int y)
{
this.x = x;
this.y = y;
}
}
如果字段是private 需通过getDeclareField()方法获取
Method类:
Method methodCharAt = String.class.getMethod("charAt",int.class);
methodCharAt.invoke("abc",1);
如果传递给Method对象的invoke方法的第一个参数为null,这有什么意义呢?说明该method对应的是一个静态方法。
数组的反射:
<span style="white-space:pre"> </span> int[] i1 = new int[3];
int[] i2 = new int[4];
int[][] i3 = new int[2][3];
<pre name="code" class="java"> String[] i4 = new String[2];
System.out.println(i1.getClass()==i2.getClass()); //true同一纬度、同一类型的字节码相同 System.out.println(i1.getClass()==i3.getClass()); //false字节码不同
Object[] o1= i1; //报错
Object[] o2= i3; //正确
Object[] o3= i4; //正确
如果实现打印 Arrays.asList(i1);
Arrays.asList(i1);
Arrays.asList(i1);
如何实现快速打印数组的值.(不通过遍历的方法)
<span style="color:#ff0000;"> int[] i1 = new int[]{1,2,3};
Integer[] i2 = new Integer[]{1,2,3};
String[] i4 = new String[]{"abc","def"};
System.out.println(Arrays.asList(i1)); //[[I@2a3714c9]
System.out.println(Arrays.asList(i2)); //[1, 2, 3]
System.out.println(Arrays.asList(i4)); //[abc, def]</span>
注意观察i1 i2的区别 ,为什么i1行 i2不行
Array工具用于对数组的反射。
public static void main(String[] args) throws Exception
{
printArray("ss");
printArray(new String[]{"123","22"});
}
public static void printArray(Object obj)
{
Class clazz = obj.getClass();
if(clazz.isArray())
{
int len = Array.getLength(obj);
for(int i=0; i<len; i++)
{
System.out.print(Array.get(obj,i) + " ");
}
}
else
{
System.out.println(obj);
}
}