JAVA-反射学习(3)
来源:互联网 发布:js insertbefore 方法 编辑:程序博客网 时间:2024/06/05 15:27
import java.lang.reflect.*;class Stu{ private String name; private int age; public boolean flag =true; public Stu(){} public Stu(String name,int age){ this.setName(name); this.setAge(age); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void study(){ System.out.println("i can study"); } private void speak(String languge,int x){ System.out.println("I can speak :"+languge+" "+x); } public String toString(){ return this.name+" : "+this.age; }}public class ReflectThree { public static void classForInstance() throws Exception{ //第一步:我们通过上面的三种方式可以得到类的信息; @SuppressWarnings("unchecked") Class<Stu> stuClass = (Class<Stu>)Class.forName("GeneIterAdaptReflect.com.Stu"); //第二步:如果该类Stu有无参的构造器,那么就可以用类信息调用newInstance();来创建一个实例 //好处:降低了于类(子类)之间的耦合,比如Stu是一个接口或者超类,我们就可以利用多态直接与接口打交道,来调用子类的方法 Stu stu1 = stuClass.newInstance(); stu1.setName("丽丽"); System.out.println(stu1.getName()); //第三步:通过有参数的构造器实例对象; @SuppressWarnings("unchecked") Constructor<Stu>[] constructor = (Constructor<Stu>[]) stuClass.getConstructors(); Stu stu2 = constructor[1].newInstance("qian",36); System.out.println(stu2.toString()); } public static void methodInfo() throws Exception{ @SuppressWarnings("unchecked") Class<Stu> stuClass = (Class<Stu>) Class.forName("GeneIterAdaptReflect.com.Stu"); //第四步:获取类的全部方法 public void study(); Method[] methods = stuClass.getDeclaredMethods(); for(Method m:methods){ StringBuilder s = new StringBuilder(); //返回修饰符: int x = m.getModifiers(); String modifyString = Modifier.toString(x); //返回值类型; Class<?> returnType = m.getReturnType(); //Type returnType = m.getGenericReturnType(); //参数个数及类型: Class<?>[] paraClass = m.getParameterTypes(); if(paraClass.length==0){ s.append(""); } else{ for(int i=0;i<paraClass.length;i++){ s.append(paraClass[i].getSimpleName()+" "); } } System.out.println(modifyString+" "+returnType.getSimpleName()+" "+m.getName() +"("+s+")"); } } public static void fieldInfo() throws Exception{ Class<Stu> stuClass = (Class<Stu>) Class.forName("GeneIterAdaptReflect.com.Stu"); Field[] fields = stuClass.getDeclaredFields(); for(int i=0;i<fields.length;i++){ System.out.println(Modifier.toString(fields[i]. getModifiers())+" "+fields[i].getName()); } } public static void callSpeakMethod()throws Exception{ //第一步拿到对象 Class<Stu> stuClass = (Class<Stu>) Class.forName ("GeneIterAdaptReflect.com.Stu"); Constructor<Stu>[] constructor= (Constructor<Stu>[]) stuClass.getConstructors(); Stu stu3 = constructor[1].newInstance("qian",26); //第二步拿到方法 Class<?>[] paraClass =new Class[] {String.class,int.class}; Method privateMethod = stuClass.getDeclaredMethod("speak",paraClass); //设置私有方法的可访问权 privateMethod.setAccessible(true); //调用方法 privateMethod.invoke(stu3, "English French",2); } /** * @param obj: 对象 * @param fieldName :属性名称(字段名) * @param paraType : 参数类型 * @param value :想赋予的值 * @throws Exception */ public static void setter(Object obj,String fieldName,Class<?> paraType,Object value) throws Exception{ //set的方法的标准写法:setName,而传进来的fieldName是字段 名 比如 name;要转换成标准形式; String firstChar = fieldName.substring(0, 1).toUpperCase(); String methodName = firstChar+fieldName.substring(1); obj.getClass().getDeclaredMethod ("set"+methodName, paraType).invoke(obj, value); } /** * @param obj :对象名 * @param fieldName :要get的字段名 * @return Object :返回任意类型值 * @throws Exception */ public static Object getter(Object obj,String fieldName) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{ String firstChar = fieldName.substring(0, 1).toUpperCase(); String methodName = firstChar+fieldName.substring(1); //return obj.getClass().getDeclaredMethod("get"+methodName,null).invoke(obj,null); return obj.getClass().getDeclaredMethod("get"+methodName).invoke(obj); } public static void main(String[] args) throws Exception { Class<Stu> stuClass = (Class<Stu>) Class.forName("GeneIterAdaptReflect.com.Stu"); Stu stuObj = stuClass.newInstance(); setter(stuObj,"name",String.class,"zhangsan"); String getString =(String)getter(stuObj,"name"); System.out.println(getString); }}
0 0
- JAVA-反射学习(3)
- Java反射机制的学习(3)
- java 反射机制-学习笔记(3)
- Java反射机制学习3
- java反射学习(Reflection)
- java反射学习(Reflection)
- Java 反射学习(一)
- Java-反射(学习笔记)
- java反射(3):反射机制
- Java反射学习总结(3)——反射的基本操作
- java反射学习笔记(3)----使用反射来调用方法
- Java 反射学习(二)成员变量的反射
- Java 反射学习(三)成员方法的反射
- Java 反射学习(五)反射的main方法
- java-反射(一)-反射的概念性学习
- Java反射机制的学习(转)
- Java中反射机制(Reflection)学习
- Java反射学习笔记(待整理)
- Lua中__index和__newindex实践
- zeppelin源码分析(1)——编译、调试和maven modules分析
- unix编程(九)进程间通信
- 十进制、二进制互转
- 数组------和为定值的多个数
- JAVA-反射学习(3)
- CI框架中pdo的使用方法
- 【Android 学习】AndroidMainfest.xml详解
- c++开发ocx入门实践三--基于opencv的简易视频播发器ocx
- 字典树trie
- oracle数据库的静默(Quiesce)状态
- 长微博图片制作(无水印)
- Android小技巧
- C++重载重写重定义