黑马程序员技术交流社区

标题: 编写一个类 [打印本页]

作者: 职业规划-苏小粉老师    时间: 2012-5-14 19:56
标题: 编写一个类
编写一个类,增加一个实例方法用于打印一条字符串。并使用反射手段创建该类的对象,并调用该对象中的方法。
作者: 蒋映辉    时间: 2012-5-14 20:06
  1. package com.a;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;

  5. class Str{
  6.         private String s;
  7.         public Str(String s){
  8.                 this.s=s;
  9.                
  10.         }
  11.         public void print(){
  12.                 System.out.println(s);
  13.         }
  14. }
  15. public class Test3 {
  16.        
  17.         public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
  18.                 Class str=Str.class;
  19.                 Constructor cs=str.getConstructor(String.class);
  20.                 Str st=(Str) cs.newInstance("谢谢苏老师给分");
  21.                 Method m=str.getMethod("print" );
  22.                 m.invoke(st);
  23.                
  24.         }
  25.        
  26. }
复制代码

作者: 蒋映辉    时间: 2012-5-14 20:07
嘎嘎  因为赶工,代码有点乱,不过应该符合要求吧。。。。
作者: suiabing    时间: 2012-5-14 20:29
package day31;

import java.lang.reflect.Method;

public class Su {
       
        public static void main(String[] args) throws Exception {               
               
                Object obj = Class.forName("day31.MyString").newInstance();
                Method myMethod = Class.forName("day31.MyString").getDeclaredMethod("myPrint", String.class);
                myMethod.invoke(obj, "Hello Teacher Su!");               
        }
}

class MyString{   

    public void myPrint(String s){
            System.out.println(s);
    }
}
哦了


作者: 安路凤    时间: 2012-5-14 20:33
蒋映辉 发表于 2012-5-14 20:07
嘎嘎  因为赶工,代码有点乱,不过应该符合要求吧。。。。

你那个class str=str.getClass()是什么意思呢??求赐教
作者: 蒋映辉    时间: 2012-5-14 20:38
安路凤 发表于 2012-5-14 20:33
你那个class str=str.getClass()是什么意思呢??求赐教

凤姐还没看反射吧  这个 获取正在运行时类.....
然后可以通过它来得到类里边的方法啊 field啊 什么什么的
然后就能实现要求了
作者: 安路凤    时间: 2012-5-14 20:43
蒋映辉 发表于 2012-5-14 20:38
凤姐还没看反射吧  这个 获取正在运行时类.....
然后可以通过它来得到类里边的方法啊 field啊 什么什么的 ...

RealSubject rs = new RealSubject();
  //接口指向实现它的类对象 ds 参数为 rs
  InvocationHandler ds = new DynamicProxy(rs);
  //????
  Class<?> cls = rs.getClass();
  //????
  Subject sub = (Subject)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), ds);
  sub.request();
确实没看过 你帮我看下这个吧 Subject是接口
我不明白这怎么回事
作者: 蒋映辉    时间: 2012-5-14 20:59
安路凤 发表于 2012-5-14 20:43
RealSubject rs = new RealSubject();
  //接口指向实现它的类对象 ds 参数为 rs
  InvocationHandler d ...

这个就是利用动态代理类来为接口动态生成实现类来着
作者: 小小企鹅    时间: 2012-5-14 21:02
import java.lang.reflect.*;
public class PrintStr {
        public static void main(String[] args) {
                Class<?> sp = null;
                Object obj = null;
                Method method = null;
                try {
                        sp = Class.forName("StringPrint");
                } catch (Exception e) {
                        e.printStackTrace();
                }
                Constructor<?> cons[] = sp.getConstructors();// 取得全部的构造函数
                try {
                        method = sp.getMethod("print");// 返回一个 Method 对象,反映此 Class
                                                                                        // 对象所表示的类或接口的指定公共成员方法。
                        obj = cons[0].newInstance("输出的内容");// 创建新实例,指定的初始化参数str初始化该实例。
                        method.invoke(obj); // 对带有指定参数的指定对象调用由此 Method对象表示的底层方法。
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}
class StringPrint {
        String _str;

        public StringPrint(String str) {
                _str = str;
        }

        public void print() {
                System.out.println(_str);
        }
}

作者: 褚代江    时间: 2012-5-14 22:51
来晚了啊。有这样的机会,喊一声的啊
作者: 贠(yun)靖    时间: 2012-5-14 22:53
褚代江 发表于 2012-5-14 22:51
来晚了啊。有这样的机会,喊一声的啊

现在写出来 还会给的 这是老师搞的小活动 赶紧哪
作者: 可见    时间: 2012-5-15 05:19
本帖最后由 刘珂觐 于 2012-5-15 05:24 编辑

苏老师注册一周年纪念日
发福利哇
作者: 黑马罗坚    时间: 2012-5-15 18:11
import static java.lang.System.out;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class FanSe {
        public <T> void print(T t){
                out.println(FanSe.class+"print方法:"+t);
        }
}

class FanSeDemo{
        public static void main(String[] args)throws Exception{
                Class fanSeClass=Class.forName("FanSe");
                Object con=fanSeClass.getConstructor().newInstance();
                Method[] ms=fanSeClass.getMethods();
                for(Method m:ms){
                        if(m.getName().equals("print")){
                                m.invoke(con, "好好学习天天向上" );
                        }
                       
                }
//                Method method=fanSeClass.getMethod("print",这里泛型类型怎么表示哦);
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2