黑马程序员--Java基础--13反射

来源:互联网 发布:广州市知用中学分数线 编辑:程序博客网 时间:2024/05/17 04:46

----------- android培训java培训java学习型技术博客、期待与您交流! ------------

反射

在我看来能够分析类能力的程序被称为反射,反射机制具有强大的功能,我们可以利用反射:在运行中分析类的能力,在运行中查看对象,实现数组的操作代码,利用Method对象。

 

(1)Class

Java将磁盘类文件加载到内存中,为一个对象,这个对象就是Class实例

如何得到各个字节码对应的实例对象(Class类型)
1.类名.class,例如,System.class
2.对象.getClass(),例如,new Date().getClass()
3.Class.forName("类名"),例如,Class.forName("java.util.Date");

示例:

public class Reflection {public static void main(String[] args) throws ClassNotFoundException {// 通过对象获取Student stu = new Student(12, "张京辉");// getClass()返回此 Object 的运行时类。Class sc = stu.getClass();System.out.println(sc);// 通过类名获取System.out.println(Student.class);// 通过Class类的静态方法forNameSystem.out.println(Class.forName("GaoXin.Student"));}}class Student {private int age;public int score;public String name;public String grade;public Student(int age, String name) {this.age = age;this.name = name;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

输出结果:

class GaoXin.Student

class GaoXin.Student

class GaoXin.Student

 

(1)Method 

Method类代表某个类中的一个成员方法。

得到类中的某一个方法:
例子:Method charAt = 

Class.forName("java.lang.String").getMethod("charAt", int.class);

 反射方式:System.out.println(charAt.invoke(str, 1)); 

 

示例:

public class Reflection {public static void main(String[] args) throws ClassNotFoundException {try {Class c = Class.forName("java.lang.String");//获取String类的全部成员方法,不包含超类的方法//getMethods返回所有的方法,包括继承的,和公共的  Method[] m = c.getDeclaredMethods();//循环输出方法信息for (Method i : m) {System.out.println(i.toString());}String str = "abc";//获取indexof方法Method method = String.class.getMethod("indexOf", int.class);//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法System.out.println(method.invoke(str, 'a'));//获取charAt方法Method methodCharAt = String.class.getMethod("charAt", int.class);System.out.println(methodCharAt.invoke(str, 1));} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}

输出结果

public boolean java.lang.String.equals(java.lang.Object)

public java.lang.String java.lang.String.toString()

public int java.lang.String.hashCode()

public int java.lang.String.compareTo(java.lang.String)

public int java.lang.String.compareTo(java.lang.Object)

public int java.lang.String.indexOf(int)

public int java.lang.String.indexOf(int,int)

public int java.lang.String.indexOf(java.lang.String)

public int java.lang.String.indexOf(java.lang.String,int)

static int java.lang.String.indexOf(char[],int,int,char[],int,int,int)

public static java.lang.String java.lang.String.valueOf(int)

public static java.lang.String java.lang.String.valueOf(char)

public static java.lang.String java.lang.String.valueOf(boolean)

public static java.lang.String java.lang.String.valueOf(float)

public static java.lang.String java.lang.String.valueOf(char[],int,int)

public static java.lang.String java.lang.String.valueOf(double)

public static java.lang.String java.lang.String.valueOf(char[])

public static java.lang.String java.lang.String.valueOf(java.lang.Object)

public static java.lang.String java.lang.String.valueOf(long)

public char java.lang.String.charAt(int)

private static void java.lang.String.checkBounds(byte[],int,int)

public int java.lang.String.codePointAt(int)

public int java.lang.String.codePointBefore(int)

public int java.lang.String.codePointCount(int,int)

public int java.lang.String.compareToIgnoreCase(java.lang.String)

public java.lang.String java.lang.String.concat(java.lang.String)

public boolean java.lang.String.contains(java.lang.CharSequence)

public boolean java.lang.String.contentEquals(java.lang.CharSequence)

public boolean java.lang.String.contentEquals(java.lang.StringBuffer)

public static java.lang.String java.lang.String.copyValueOf(char[])

public static java.lang.String java.lang.String.copyValueOf(char[],int,int)

public boolean java.lang.String.endsWith(java.lang.String)

public boolean java.lang.String.equalsIgnoreCase(java.lang.String)

public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])

public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])

public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException

public void java.lang.String.getBytes(int,int,byte[],int)

public byte[] java.lang.String.getBytes()

public byte[] java.lang.String.getBytes(java.nio.charset.Charset)

public void java.lang.String.getChars(int,int,char[],int)

void java.lang.String.getChars(char[],int)

public native java.lang.String java.lang.String.intern()

public boolean java.lang.String.isEmpty()

public int java.lang.String.lastIndexOf(java.lang.String)

public int java.lang.String.lastIndexOf(int,int)

public int java.lang.String.lastIndexOf(int)

public int java.lang.String.lastIndexOf(java.lang.String,int)

static int java.lang.String.lastIndexOf(char[],int,int,char[],int,int,int)

public int java.lang.String.length()

public boolean java.lang.String.matches(java.lang.String)

public int java.lang.String.offsetByCodePoints(int,int)

public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)

public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)

public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)

public java.lang.String java.lang.String.replace(char,char)

public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)

public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)

public java.lang.String[] java.lang.String.split(java.lang.String)

public java.lang.String[] java.lang.String.split(java.lang.String,int)

public boolean java.lang.String.startsWith(java.lang.String)

public boolean java.lang.String.startsWith(java.lang.String,int)

public java.lang.CharSequence java.lang.String.subSequence(int,int)

public java.lang.String java.lang.String.substring(int)

public java.lang.String java.lang.String.substring(int,int)

public char[] java.lang.String.toCharArray()

public java.lang.String java.lang.String.toLowerCase()

public java.lang.String java.lang.String.toLowerCase(java.util.Locale)

public java.lang.String java.lang.String.toUpperCase()

public java.lang.String java.lang.String.toUpperCase(java.util.Locale)

public java.lang.String java.lang.String.trim()

0

b

 

(1)Constructor

Constructor类代表某个类中的一个构造方法。

Constructor对象代表一个构造方法,Constructor对象上会有的方法有:得到方法名字,得到所属于的类,产生实例对象。

获取方法:

getConstructor();返回公共构造方法,意思是私有的得不到

getConstructors();返回构造方法数组,私有的得不到

getDeclaredConstructor();返回构造方法,私有的也可得到

getDeclaredConstructors();返回构造方法数组,私有的也可得到

 

示例:

public class Reflection {public static void main(String[] args) throws ClassNotFoundException {try {//获取String的构造方法并指明参数Constructor con = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例String s = (String) con.newInstance(new StringBuffer("abc"));System.out.println(s);Class c = Class.forName("GaoXin.Student");//获取全部的构造方法Constructor[] conlist = c.getConstructors();for(int i = 0;i<conlist.length;i++){Constructor ct = conlist[i];//以字符串形式返回此构造方法的名称System.out.println("name=" +ct.getName());//返回 Class 对象,该对象表示声明由此 Constructor 对象表示的构造方法的类System.out.println("decl name="+ct.getDeclaringClass());}} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}class Student {private int age;public int score;public String name;public String grade;public Student(){}public Student(int age, String name) {this.age = age;this.name = name;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

输出结果

abc

name=GaoXin.Student

decl name=class GaoXin.Student

name=GaoXin.Student

decl name=class GaoXin.Student

 

(1)Field

对应的反射的字段可能是一个类(静态)字段或实例字段。

获取字段的方法有getField();和getDeclaredField();前者不能取得私有属性的字段,后者可以,再通过setAccessible()方法。

 

示例:

public class ReflectField {public static void main(String[] args) throws Exception {// 通过构造方法反射获取实例Constructor<Student> cons = Student.class.getConstructor(int.class,String.class);Student s = cons.newInstance(12, "张京辉");s.setGrade("高三三班");try {// 获取私有的s的成员属性age(暴力反射)Field fieldAge = s.getClass().getDeclaredField("age");// 设置age的值可获取,可用fieldAge.setAccessible(true);// 打印私有ageSystem.out.println(fieldAge.get(s));outputSrting(s);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}private static void outputSrting(Student s)throws IllegalArgumentException, IllegalAccessException {// 获取Student的全部成员变量Field[] field = s.getClass().getDeclaredFields();for (Field f : field) {// 将变量属性为String的打印输出if (f.getType() == String.class) {String str = (String) f.get(s);System.out.print(str + "\t");}}}}class Student {private int age;public int score;public String name;public String grade;public Student(int age, String name) {this.age = age;this.name = name;}public String getGrade() {return grade;}public void setGrade(String grade) {this.grade = grade;}}

输出结果

12

张京辉 高三三班


----------- android培训java培训java学习型技术博客、期待与您交流! ------------




0 0
原创粉丝点击