zoukankan      html  css  js  c++  java
  • 从一个类中访问另一个类中的私有方法

    一般情况下我们无法在一个类中去访问另外一个类中非公有的方法,但有时候我们确实需要调用另外一个类中的私有方法,该怎么办呢?

    有两种方法可以解决,一个是利用反射,另一个就是用委托。

    我们可以看个Demo:

     1 namespace ReflectTest
    2 {
    3 public class TypeAndMethod
    4 {
    5 public delegate int MyHandler(int x, int y);
    6
    7 //利用反射
    8 public void CallAddByReflect()
    9 {
    10 TestMethod target = new TestInvokeMethod();
    11 Type type = target.GetType();
    12 MethodInfo method = type.GetMethod("Add", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    13
    14 if (method == null) return;
    15
    16 object[] args = new object[] { 10, 20 };//方法的参数
    17 object result = method.Invoke(target, args);
    18
    19 Console.WriteLine(result.ToString());
    20 }
    21
    22 //利用委托
    23 public void CallAddByDelegate()
    24 {
    25 TestMethod target = new TestInvokeMethod();
    26 Type t1 = typeof(MyHandler);
    27 Type t2 = typeof(TestInvokeMethod);
    28
    29 MyHandler handler1 = (MyHandler)Delegate.CreateDelegate(t1, t2, "Sub");//调用静态方法
    30 MyHandler handler2 = (MyHandler)Delegate.CreateDelegate(t1, target, "Add");//调用实例方法
    31 int result1 = handler1(1, 2);
    32 int result2 = handler2(1, 2);
    33 Console.WriteLine(result1.ToString());
    34 Console.WriteLine(result2.ToString());
    35 }
    36 }
    37
    38 public class TestInvokeMethod : TestMethod
    39 {
    40 protected override int Add(int x, int y)
    41 {
    42 return x + y;
    43 }
    44
    45 private static int Sub(int x, int y)
    46 {
    47 return x - y;
    48 }
    49 }
    50
    51 public abstract class TestMethod
    52 {
    53 protected abstract int Add(int x, int y);
    54 }
    55 }


     

  • 相关阅读:
    Java后端知识体系
    HashMap底层实现整理
    Java线程池
    Spring Boot+Dubbo 入门
    Go 代码记录(一)
    Servlet 复习
    Spring Cloud(二)Eureka:服务注册与发现
    Spring Cloud (一)概述
    数据结构基础知识
    容器技术-Docker入门
  • 原文地址:https://www.cnblogs.com/chenlinfei/p/2283951.html
Copyright © 2011-2022 走看看