检查获取系统中特定的类名和方法

检查特定系统类在OEM设备上的可用性
本文讨论了在OEM设备上检查特定系统类存在的方法,以确保在开发过程中能够正确调用Google提供的标准接口。通过创建自定义的检查函数,开发者可以避免因OEM厂商修改系统接口而导致的功能失效问题。

这是一篇我个人在EOE发的blog《检查获取系统中特定的类名和方法》,由于eoe的blog系统实在是无言以对,我就把eoe上面的帖子以及blog是都转到csdn上来,原帖地址:http://www.eoeandroid.com/blog-781265-49611.html


项目中遇到一个问题,在delete or save a contact 之后会发送Broadcaster来通知系统更新一些数据,而这个BroadcasterReceiver是google原生所提供的,正常情况下是存在,而且work的,但是一部分oem厂商把系统的一些标准接口改的乱七八糟的,导致一些正常的功能我们无法去调用或者使用,那么我们就需要再使用这个功能之前,去检查相应的类是否存在,存在之后再去执行我们的操作,code如下:


private static boolean checkReceiver(Context context) {
        try {
            Context otherContext = context.createPackageContext("com.android.phone",//com.android.phone是我们需要检查的类所在的包名
                    Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
            if (otherContext != null) {
                Class<?> clazz = otherContext.getClassLoader().loadClass(
                        "com.android.phone.CallerInfoCacheUpdateReceiver");// 我们需要检查的类的完整类路径
                if (clazz != null) {
                    Method method = clazz.getDeclaredMethod("onReceive", Context.class,
                            Intent.class);//通过反射拿到特定的方法,我这里只是为了检测是否是正确的类,但其实我们可以通过这些方法去invoke,然后达到更深的目的,具体不多说了
                    if (method != null) {
                        return true;
                    }
                }
            }
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return false;
    }


<think>我们正在讨论JavaScript中如何注入麻将相关的类名方法名。根据用户的问题,他希望在JavaScript中创建或注入与麻将相关的方法。这通常意味着要定义一些(如Player,Tile,Game等)以及相关的方法(如drawTile,discardTile, checkWin等)。由于用户提到了“注入”,可能指的是在现有的JavaScript环境中添加这些方法,或者是在某个特定的上下文中(如网页)动态添加这些功能。但根据问题描述,我们主要关注如何定义这些方法。步骤:1.定义麻将相关的,例如:麻将牌(MahjongTile)、玩家(MahjongPlayer)、游戏(MahjongGame)等。2.为这些定义方法,例如:洗牌、摸牌、打牌、检查胡牌条件等。3.由于麻将规则复杂,特别是胡牌算法,这里我们只给出一个基本框架,具体的胡牌算法可能需要大量的代码实现。注意:在JavaScript中,我们可以使用ES6的语法来定义。我们将创建以下: -MahjongTile:表示一张麻将牌,包含花色(suit)点数(rank)等属性。- MahjongPlayer:表示一个玩家,包含手牌、摸牌、打牌等方法。- MahjongGame:表示一局游戏,包含牌墙、玩家列表、当前回合等,以及游戏流程控制方法。由于胡牌算法非常复杂(涉及多种牌型,如平、断幺九、七对子、国士无双等),这里我们只实现一个简单的框架,不深入具体算法。示例代码:首先,定义麻将牌。麻将牌通常有万、筒、条、字牌等。我们用一个来表示一张牌。</think>### JavaScript 中注入麻将相关方法名的实现方式 在 JavaScript 中实现麻将相关的方法名注入,主要通过以下方式实现: #### 1. **定义麻将核心** ```javascript // 麻将牌 class MahjongTile { constructor(suit, value) { this.suit = suit; // 花色:万/筒/条/字牌 this.value = value; // 牌面值:1-9/东南西北中发白 } // 获取牌面显示名称 getDisplayName() { const suits = { 'm': '万', 'p': '筒', 's': '条', 'z': '字' }; return `${this.value}${suits[this.suit]}`; } } // 玩家 class MahjongPlayer { constructor(name) { this.name = name; this.handTiles = []; // 手牌 this.discardedTiles = []; // 弃牌 } // 摸牌方法 drawTile(tile) { this.handTiles.push(tile); } // 打牌方法 discardTile(tileIndex) { const discarded = this.handTiles.splice(tileIndex, 1)[0]; this.discardedTiles.push(discarded); return discarded; } } ``` #### 2. **游戏逻辑注入** ```javascript // 游戏控制 class MahjongGame { constructor() { this.players = []; this.wallTiles = this.generateTiles(); // 牌墙 } // 生成136张麻将牌 generateTiles() { const tiles = []; const suits = ['m', 'p', 's', 'z']; // 万/筒/条/字 suits.forEach(suit => { const max = (suit === 'z') ? 7 : 9; // 字牌7张,其他9张 for (let i = 1; i <= max; i++) { tiles.push(new MahjongTile(suit, i)); tiles.push(new MahjongTile(suit, i)); tiles.push(new MahjongTile(suit, i)); tiles.push(new MahjongTile(suit, i)); // 每种牌4张 } }); return this.shuffle(tiles); } // 洗牌算法 shuffle(tiles) { for (let i = tiles.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [tiles[i], tiles[j]] = [tiles[j], tiles[i]]; } return tiles; } // 开局发牌 dealInitialTiles() { this.players.forEach(player => { for (let i = 0; i < 13; i++) { player.drawTile(this.wallTiles.pop()); } }); } } ``` #### 3. **DOM 元素注入示例** ```javascript // 将麻将元素注入页面 function injectMahjongUI() { const container = document.createElement('div'); container.className = 'mahjong-table'; // 创建玩家区域 const playerArea = document.createElement('div'); playerArea.className = 'player-area'; playerArea.innerHTML = '<h3>玩家手牌区</h3>'; container.appendChild(playerArea); document.body.appendChild(container); } // 调用注入函数 injectMahjongUI(); ``` #### 4. **胡牌检测方法示例** ```javascript // 胡牌检测(简化版) MahjongPlayer.prototype.checkWin = function() { // 实现胡牌算法(需完整实现七对、平等逻辑) const tileCounts = this.countTiles(); // 简化逻辑:检测是否组成4个面子1对眼 let melds = 0, pair = false; Object.values(tileCounts).forEach(count => { if (count >= 3) melds++; if (count === 2) pair = true; }); return melds === 4 && pair; }; // 统计牌型 MahjongPlayer.prototype.countTiles = function() { return this.handTiles.reduce((counts, tile) => { const key = `${tile.suit}-${tile.value}`; counts[key] = (counts[key] || 0) + 1; return counts; }, {}); }; ``` ### 关键注意事项 1. **类名规范**:使用 `Mahjong` 前缀避免命名冲突(如 `MahjongTile`, `MahjongGame`) 2. **方法命名**: - 操作:`drawTile()`, `discardTile()` - 检测:`checkWin()`, `checkReadyHand()` - 状态:`countTiles()`, `getHandStatus()` 3. **DOM 注入**:通过 CSS 类名如 `.mahjong-tile` 实现样式隔离 4. **规则实现**:胡牌算法需根据具体规则(日麻/国标)实现完整逻辑[^2] ### 实际应用场景 ```javascript // 初始化游戏 const game = new MahjongGame(); game.players = [ new MahjongPlayer("玩家A"), new MahjongPlayer("玩家B") ]; // 开局操作 game.dealInitialTiles(); game.players[0].discardTile(3); // 玩家A打出第4张牌 // 检测胡牌 if (game.players[1].checkWin()) { console.log("胡牌!"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值